如何在perl中顺序匹配几个正则表达式模式

时间:2011-03-17 23:27:30

标签: regex perl

我希望以下列方式为大型多行文字进行匹配:

我有一些匹配的模式:

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

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

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

如果其中任何一个匹配,则打印结果print $1,然后继续其余文本以再次匹配三种模式。

如何按照它们在整个文本中出现的顺序获得打印结果?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

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
  }
}