Регулярное выражение для разбора многострочной строки

#regex #perl

#регулярное выражение #perl

Вопрос:

Я извлекаю журнал заметок из записи Clearquest (да, я знаю, CQ невероятно старый), который включает в себя несколько элементов, которые мне нужны, инкапсулированные в двойные кавычки и разделенные точкой с запятой, что, по сути, делает его jira-импортируемым в качестве комментария. Вот пример того, что может содержать журнал заметок. Это сохраняется внутри переменной в perl.

 ===== State: In_Work by:user1 at 12/13/2010 10:47:23 =====

Generic notes log entry that can span multiple lines depending on length
of sentence.

===== State: In_Work by:user2 at 06/04/2010 17:34:42 =====

Another generic notes log entry.
  

Из приведенного выше примера в качестве конечного результата мне нужно что-то вроде следующего:

 my @notes_log_entries = (""12/13/2010 10:47:23;user1;Generic notes log entry that can span multiple lines depending on lengthrnof sentance"", ""06/04/2010 17:34:42;user2;Another generic notes log entry."");
  

Следующий код работает, но только для переменных, содержащих две записи журнала notes:

 $Notes_Log = $resultset->GetColumnValue(7);
print "Notes Log Before: $Notes_Logn";
$Notes_Log =~ s/R//g;
$Notes_Log =~ s/^===== State: .* by:(.*) at (.*) =====(.*)===== State: .* by:(.*) at (.*) =====(.*)/rtx-$1;$2;$3nrtx-$4;$5;$6/g;
print "Notes Log After:n$Notes_Logn";
  

Вот несколько примеров вывода из приведенного выше кода:

 Notes Log Before:
===== State: In_Work by:user1 at 12/13/2010 10:47:23 =====

Generic notes log entry that can span multiple lines depending on length
of sentence.

===== State: In_Work by:user2 at 06/04/2010 17:34:42 =====

Another generic notes log entry.

Notes Log After:
rtx-user1;12/13/2010 10:47:23;Generic notes log entry that can span multiple lines depending on length
of sentence.
rtx-user2;06/04/2010 17:34:42;Another generic notes log entry.
  

Ответ №1:

конечно, вероятно, есть еще много способов решить проблему, вот мой:

 my @notes_log_entries = ();

while ($Notes_Log =~ s/===== State: .* by:(.*) at (.*) =====RR([ws.]*)R?R?//) {
    my $single_entry .= '"'.$2.';'.$1.';'.$3.'"';
    $single_entry =~ s/ss//g;
    push(@notes_log_entries, $single_entry);    
}
  

Цикл while часто помогает мне при создании регулярных выражений, поскольку он уменьшает сложность фактического регулярного выражения.

Комментарии:

1. ОЧЕНЬ приятно! Это работает хорошо. Вы же не создавали учетную запись только для того, чтобы ответить на это, не так ли!? 😉 Я вижу, вы новый участник, добро пожаловать! И еще раз, спасибо за ответ! 🙂 Я не часто использовал R, на самом деле даже не знал, что он делает. Это пригодится и во многих других ситуациях.

2. Рад, что это помогло! Раньше у него не было учетной записи, просто никогда не было времени, чтобы что-то сделать :). Теперь я могу, наконец, проголосовать за полезные ответы 😉