不要理解我的正则表达式的匹配

时间:2014-05-25 19:13:28

标签: regex perl

我目前正在从文件中读取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

有人能解释一下这里发生了什么吗?

2 个答案:

答案 0 :(得分:1)

使用?使*+量词非贪婪,因为默认情况下它们是贪婪的(即尽可能匹配任何字符.

$str =~ /<tag.*?(x|y|z)=\"(\d+)\".*?(x|y|z)=\"(\d+)\".*?(x|y|z)=\"(\d+)\".*\/>/

答案 1 :(得分:1)

而不是.*使用\s+。实际上你想要匹配多个空格字符。没有多个任何字符。

如果这确实是一项任务,你应该以更恰当的方式进行。正则表达式不是xml的正确方法。因为它的任务只是编写一个解析器。这比你想象的容易。