2013-10-11 92 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描述,量化的子模式是「貪婪」,也就是說,它會多次匹配越好(給出一個特定的起始位置),同時還允許其餘的模式相匹配。如果您希望它符合可能的最小次數,請使用「?」來跟隨量詞。需要注意的意義,不會改變,只是「貪」:

相關問題