2013-10-11 59 views
0

我有以下几点:Perl的正则表达式匹配第一次出现

my $str='"fld":{xyz..,"val":"x"},"fldA":{afd;ladf,"val":"valid y"},"fldB":{adsa;afda,"val":"invalid val x"}...'; 
my $fldNm="fldA"; 
if ($str =~ /"$fldNm".*"val":"([^"]+)"/) { 
    print "\n Val = $1 \n"; 
} 

什么是正确的正则表达式匹配/打印“有效Y”

目前正则表达式匹配“了fldA”和贪婪的比赛,并跳过它的价值,而是给我的最后一个值: “无效VAL X”

感谢,

杰斯

+1

http://www.perlmonks.org/?node_id=1057881 – toolic

+1

使用惰性限定符代替:?'' –

+0

谢谢为你的答案:) – jessarah

回答

2

正如你所提到的.*是贪婪的,它将继续吞噬除行结束以外的所有事物。在完成匹配到行尾后,它会解析下一个模式"val"。因为我们已经吃完了所有的路线,正则表达式现在会回溯到找到第一个匹配。由于它的回溯,它将匹配最接近该行末尾的模式,并且因为它找到匹配而停止。

您需要使用非贪婪量词.*?来告诉正则表达式只吞下字符,直到找到下一个模式,而不是吞下所有东西并回溯。

这下Quntifiers

默认情况下此http://perldoc.perl.org/perlre.html描述,量化的子模式是“贪婪”,也就是说,它会多次匹配越好(给出一个特定的起始位置),同时还允许其余的模式相匹配。如果您希望它符合可能的最小次数,请使用“?”来跟随量词。需要注意的意义,不会改变,只是“贪”:

相关问题