2012-06-26 5 views
5
my @matches = ($result =~ m/INFO\n(.*?)\n/); 

Итак, в Perl я хочу сохранить все соответствия этому регулярному выражению. Я хочу сохранить значение между INFO \ n и \ n каждый раз, когда это происходит.Regex - сопоставить все вхождения?

Но я получаю только последнее вхождение. Неправильно ли мое регулярное выражение?

+0

Возможный дубликат [Как найти все совпадения с регулярным выражением в Perl?] (Http://stackoverflow.com/questions/1723440/how-can-i-find-all-matches-to-a- regular-expression-in-perl) – centic

ответ

10

Используйте модификатор /g для глобального сопоставления.

my @matches = ($result =~ m/INFO\n(.*?)\n/g); 

Ленивый Количественное является необходимым в данном случае как . не соответствует новой строки. Ниже будет давать более высокую производительность:

my @matches = ($result =~ m/INFO\n(.*)\n/g); 

/s может быть использована, если вы хотите периоды, чтобы соответствовать новой строки. Для получения дополнительной информации об этих модификаторах см. perlre.

+0

Lazy quantification '. *?' hurts regex performance –

+0

Почему '/ s' необходим? Я не вижу причин для этого, так как его совпадение ** не должно содержать никаких символов новой строки. –

+0

Вы правы, что это не имеет значения в этом случае, но поскольку он не знал о '/ g' и соответствовал многострочным строкам, казалось разумным, что ему понадобится'/s' раньше или позже. – Tim

Смежные вопросы