我希望以下列方式为大型多行文字进行匹配:
我有一些匹配的模式:
$text =~ m#finance(.*?)end#s;
$text =~ m#<class>(.*?)</class>#s;
$text =~ m#/data(.*?)<end>#s;
如果其中任何一个匹配,则打印结果print $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
}
}