2013-04-10 3 views
1

Так вот у меня есть IRC журналы, которые приходят из БНК в формате (где [AA: BB: CC] не фактическое время, только время загрузки):Преобразование разговоров Журналы IRC с регулярным выражением?

[AA:BB:CC] <Person1> [re:al:ts] BLAH BLAH BLAH 
[AA:BB:CC] <Person2> [an:ot:he] BLAH BLAH BLAH 
[AA:BB:CC] <Person3> [rr:ea:lt] BLAH BLAH BLAH 
[AA:BB:CC] <Person4> [im:es:tp] BLAH BLAH BLAH 

Я хотел бы чтобы преобразовать его в:

[re:al:ts] <Person1> BLAH BLAH BLAH 
[an:ot:he] <Person2> BLAH BLAH BLAH 
[rr:ea:lt] <Person3> BLAH BLAH BLAH 
[im:es:tp] <Person4> BLAH BLAH BLAH 

Возможно ли это? Я вижу, что [AA: BB: CC] можно легко удалить, но как бы сохранить реальные временные метки и перенести их в/начало/линии без удаления «бла-бла-бла» или «с»? Честно говоря, я не очень хорошо разбираюсь в регулярных выражениях ...

Спасибо :) Maple

+0

Правильно ли я думать, временные метки имеют вид 'чч: мм: ss'? Кюльд вы представляете реальный пример? Если вы не хотите, чтобы я догадался, что такое содержимое вашего файла. –

ответ

0

Если вы не используете соответствие многострочных, попробуйте это регулярное выражение:

/\[.*?](<.*?>)\[(.*?)]/g 

и вы бы заменить:

"[$2]$1" 
2

пример решить:

perl -pe 's/^\[..:..:..](.*)(\[..:..:..]) (.*)/$2$1$3/' <<EOT 
[AA:BB:CC] <Person1> [re:al:ts] BLAH BLAH BLAH 
[AA:BB:CC] <Person2> [an:ot:he] BLAH BLAH BLAH 
[AA:BB:CC] <Person3> [rr:ea:lt] BLAH BLAH BLAH 
[AA:BB:CC] <Person4> [im:es:tp] BLAH BLAH BLAH 
EOT 

Выход:

[re:al:ts] <Person1> BLAH BLAH BLAH 
[an:ot:he] <Person2> BLAH BLAH BLAH 
[rr:ea:lt] <Person3> BLAH BLAH BLAH 
[im:es:tp] <Person4> BLAH BLAH BLAH 

Если AA, BB, CC, ... являются числами, а затем использовать \d\d вместо .. в PERL регулярных выражений.

+0

Интересно, я не понимал, что вам не нужно скрывать закрытие «]». Код немного более краткий в perl ... –

+0

@ bmorris591 Да, -p и -n args значительно сокращают накладные расходы. – TrueY

0

Давайте сначала сделаем несколько предположений.

  1. Timestamps в формы [чч: мм: сс], секунды/мин при 10 выражены как 01 и т.д.
  2. Лицо строка не содержит "["

Тогда следующее регулярное выражение будет работать:

^\[\d{2}:\d{2}:\d{2}\]([^\[]++)(\[\d{2}:\d{2}:\d{2}\])(.*)$ 

Вот тестовый пример написан на Java:

public static void main(String[] args) { 
    final String[] strings = {"[AA:BB:CC] <Person1> [re:al:ts] BLAH BLAH BLAH", 
     "[12:12:11] <Person2> [14:10:25] BLAH BLAH BLAH", 
     "[12:12:11] <Person3> [14:10:25] BLAH BLAH BLAH", 
     "[12:12:11] <Person4> [14:10:25] BLAH BLAH BLAH"}; 
    final Pattern pattern = Pattern.compile("^\\[\\d{2}:\\d{2}:\\d{2}\\]([^\\[]++)(\\[\\d{2}:\\d{2}:\\d{2}\\])(.*)$"); 
    for(final String string : strings) { 
     final Matcher matcher = pattern.matcher(string); 
     if(matcher.matches()) { 
      System.out.println(matcher.group(2) + matcher.group(1) + matcher.group(3)); 
     } 
    } 
} 

Выход:

[14:10:25] <Person2> BLAH BLAH BLAH 
[14:10:25] <Person3> BLAH BLAH BLAH 
[14:10:25] <Person4> BLAH BLAH BLAH