0

我有以下内容:

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”

谢谢,

杰斯

4

1 回答 1

2

正如您提到的那样.*,它是贪婪的,它将继续吞噬除行尾之外的所有内容。在一直匹配到行尾之后,它将解析下一个模式"val"。由于我们一直吃到行尾,正则表达式现在将回溯,直到找到第一个匹配项。由于它的回溯,它将匹配最接近行尾的模式并在找到匹配后停止。

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

这在 Quntifiers 下的http://perldoc.perl.org/perlre.html有描述

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

于 2013-10-11T13:27:18.620 回答