我目前正在从文件中读取xml balise,但我试图将其简化为这个简单的例子。
#!/usr/bin/perl
use strict;
use warnings;
my $str = '<tag x="20" y="7" x="15" z="14"/>';
if($str =~ /<tag.*(x|y|z)=\"(\d+)\".*(x|y|z)=\"(\d+)\".*(x|y|z)=\"(\d+)\".*\/>/){
print "$1-$2\n";
print "$3-$4\n";
print "$5-$6\n";
}
据我了解我的正则表达式,第一个x
应与第一组相匹配,第一组y
与第三组匹配x
。
所以我期待输出:
x-20
y-7
x-15
但是我得到了
y-7
x-15
z-14
有人能解释一下这里发生了什么吗?
答案 0 :(得分:1)
使用?
使*
,+
量词非贪婪,因为默认情况下它们是贪婪的(即尽可能匹配任何字符.
)
$str =~ /<tag.*?(x|y|z)=\"(\d+)\".*?(x|y|z)=\"(\d+)\".*?(x|y|z)=\"(\d+)\".*\/>/
答案 1 :(得分:1)
而不是.*
使用\s+
。实际上你想要匹配多个空格字符。没有多个任何字符。
如果这确实是一项任务,你应该以更恰当的方式进行。正则表达式不是xml的正确方法。因为它的任务只是编写一个解析器。这比你想象的容易。