perl正则表达式匹配第一次出现

时间:2013-10-11 13:05:42

标签: regex 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”和贪婪的匹配并跳过它的值,而是给我最后一个值:“invalid val x”

谢谢,

尔杰斯

1 个答案:

答案 0 :(得分:2)

正如你所提到的,.*是贪婪的,它将继续吞下除了行尾之外的所有内容。在一直匹配到行尾之后,它将解析下一个模式"val"。因为我们已经一直吃到线的末端,正则表达式现在将回溯到找到第一场比赛。由于它的回溯,它将匹配最接近线末端的模式,并且因为它找到匹配而停止。

你需要使用非贪婪量词.*?告诉正则表达式只能吞下字符,直到你找到下一个模式,而不是吞下所有内容和后退跟踪。

这里描述了Quntifiers

下的http://perldoc.perl.org/perlre.html
  

默认情况下,量化的子模式是“贪婪的”,也就是说,它将尽可能多地匹配(给定一个特定的起始位置),同时仍然允许模式的其余部分匹配。如果您希望它与可能的最小次数匹配,请使用“?”跟随量词。请注意,含义不会改变,只是“贪婪”: