我有以下内容:
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”
谢谢,
尔杰斯
答案 0 :(得分:2)
正如你所提到的,.*
是贪婪的,它将继续吞下除了行尾之外的所有内容。在一直匹配到行尾之后,它将解析下一个模式"val"
。因为我们已经一直吃到线的末端,正则表达式现在将回溯到找到第一场比赛。由于它的回溯,它将匹配最接近线末端的模式,并且因为它找到匹配而停止。
你需要使用非贪婪量词.*?
告诉正则表达式只能吞下字符,直到你找到下一个模式,而不是吞下所有内容和后退跟踪。
这里描述了Quntifiers
下的http://perldoc.perl.org/perlre.html默认情况下,量化的子模式是“贪婪的”,也就是说,它将尽可能多地匹配(给定一个特定的起始位置),同时仍然允许模式的其余部分匹配。如果您希望它与可能的最小次数匹配,请使用“?”跟随量词。请注意,含义不会改变,只是“贪婪”: