Perl正则表达式匹配可能不存在的标记

时间:2014-05-26 20:01:46

标签: regex perl html-parsing

我正在尝试构建一个匹配字符串的Perl正则表达式:

no tags
beginning<tag>this is tag</tag>rest of line
<tag1>this is tag1</tag1>
<tag1>this is tag1</tag1>rest of line

我想使用分组来提取标签以及它们之间的内容。

我试着用这个:

$a="beginning<tag>this is tag</tag>rest of line";

print "a=$a\n\n";

($x0, $x1, $x2, $x3, $x4, $x5) = ($a =~ /(.*?)(<tag>)(.*)(<\/tag>)(.*)/);

print "x0=$x0\n";
print "x1=$x1\n";
print "x2=$x2\n";
print "x3=$x3\n";
print "x4=$x4\n";


a=beginning<tag>this is tag</tag>rest of line

x0=beginning
x1=<tag>
x2=this is tag
x3=</tag>
x4=rest of line

我想要的是什么,但如果这是源字符串:

a=there are no tags

x0=
x1=
x2=
x3=
x4=

没有什么比赛。

1 个答案:

答案 0 :(得分:2)

这就是你要找的东西(见online demo):

(?m)(.*?)(?:$|(<[^>]*>)([^<]*)(</[^>]*>)(.*))

这是如何运作的?

  1. 顶部的(?m)多行修饰符可确保$可以匹配每行的结尾,因为您似乎在文件中工作。
  2. 第一个捕获组(.*?)之后是一个替换:该行的$末端,允许您在没有标记时捕获该字符串; |或您的标记和可选尾部。