知道组中的哪个表达式匹配

时间:2014-05-23 16:35:07

标签: regex perl

我正在学习正则表达式,我有一个问题。

我们说我有以下xml balise。

<xml x="5"/>

x的值可以说是foobar,所以我可以

<xml foo="6"/>
<xml bar="7"/>

在读取我的文件并捕获引号中的值时,我创建了一个正则表达式来匹配此表达式。

print $1."\n" if /<xml\s(?:foo|bar)=\"(\d+)\"\/>/;

输出

6
7

现在我的问题是,有没有办法知道是foo还是bar使正则表达式匹配?

我问这个是因为当我需要输入一个foo的值时,我有两个数组,而另一个数组需要bar的值

我能做到:

push @fooValues, $1 if /<xml\sfoo=\"(\d+)\"\/>/;
push @barValues, $1 if /<xml\sbar=\"(\d+)\"\/>/;

但我觉得这不是可行的方式,所以我想知道是否有办法知道哪个群体匹配。

2 个答案:

答案 0 :(得分:1)

只使用捕获而不是非捕获组:

print "$1 - $2\n" if m{<xml\s(foo|bar)="(\d+)"/>};

显然,您必须使用一些虚假数据来学习正则表达式,但我希望您最终意识到实际的XML Parser是使用XML的最佳工具,而不是正则表达式。

答案 1 :(得分:1)

您的问题是您正在使用非捕获构造(?:...)。如果您只是使用括号来制作正常的捕获组,那么foo中的bar$1以及$2中的数字都会为$1。然后你可以检查$vals[$1] = $2 的值并适当地处理这个数字。

您甚至可以使用哈希来存储值:

{{1}}

(另外,插入关于使用正则表达式解析xml的标准警告。也就是说,如果你某些 xml构造你要解析的那些仅限于一些简单且众所周知的子集对于xml语言,正则表达式可以正常工作。)