Как сопоставить несколько шаблонов регулярных выражений последовательно в Perl - PullRequest
0 голосов
/ 18 марта 2011

Я хочу выполнить сопоставление для большого многострочного текста следующим образом:

У меня есть несколько подходящих шаблонов:

$text =~ m#finance(.*?)end#s;

$text =~ m#<class>(.*?)</class>#s;

$text =~ m#/data(.*?)<end>#s;

Если совпадает любой из них, выведите результат print $1, а затем продолжите с остальным текстом, чтобы снова сопоставить три шаблона.

Как получить распечатанные результаты в том порядке, в котором они отображаются во всем тексте?

Большое спасибо за вашу помощь!

1 Ответ

5 голосов
/ 18 марта 2011
while ($text =~ m#(?: finance (.*?) end
                  |   <class> (.*?) </class>
                  |   data    (.*?) </end>
                  )
                 #sgx) {
  print $+;
}

должен это сделать.

$+ - последняя группа захвата, которая успешно сопоставлена.

Модификатор /g предназначен специально для этого вида использования; он превращает регулярное выражение в итератор, который после возобновления продолжает совпадение, в котором он остановился, вместо перезапуска в начале $text.

/x позволяет вам использовать произвольные пробелы, то есть вы можете сделать свои регулярные выражения читабельными . Или, по крайней мере, настолько читаемыми, насколько они получают.)

Если вам нужно иметь дело с несколькими захватами, это становится немного сложнее, поскольку вы не можете использовать $+. Тем не менее, вы можете проверить наличие групп захвата define d:

while ($text =~ m#(?: a (.*?) b (.*?) c
                  |   d (.*?) e (.*?) f
                  |   data      (.*?) </end>
                  )
                 #sgx) {
  if (defined $1) {
    # first set matched (don't need to check $2)
  }
  elsif (defined $3) {
    # second set matched
  }
  else {
    # final one matched
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...