我正在学习正则表达式,我有一个问题。
我们说我有以下xml balise。
<xml x="5"/>
x的值可以说是foo
或bar
,所以我可以
<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+)\"\/>/;
但我觉得这不是可行的方式,所以我想知道是否有办法知道哪个群体匹配。
答案 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语言,正则表达式可以正常工作。)