2016-11-25 98 views
-1

有人能向我解釋ungreedy不工作,這是爲什麼不工作:正則表達式用Perl,如預期

# echo '"Hello,1" "Hello,2" "Hello,3"' | perl -pe 's/".+?,3"/1/' 
1 

# echo '"Hello,1" "Hello,2" "Hello,3"' | perl -pe 's/".+?,2"/1/' 
1 "Hello,3" 

我的意圖是要替換/只找到「你好, 3「/」你好,2「,但似乎非貪婪修飾符(或我的大腦)沒有按預期工作。

+0

正則表達式引擎從左至右字符串匹配,' 「'匹配的第一個'」'和' 。+?'正確地完成了它的工作,匹配到了第一個''3''。期望的輸出是什麼,BTW? –

+0

您能澄清一下預期的輸出是什麼嗎?「Hello,1」「Hello,2」 1'? –

回答

2

我想你誤會正則表達式,但實際上我可能會建議不同的解決這一個位。如果你有一系列要操縱的詞,我建議使用split/join/map來進行操作。

我認爲它的尺度更好,並且不會在模式匹配邊界所在的清晰度問題上絆倒。

事情是這樣的:

my $str = '"Hello,1" "Hello,2" "Hello,3"'; 

$str = join (" ", map { s/Hello,[23]/1/r } split (" ", $str)); 
print $str; 

或者作爲一個班輪:

perl -ape "/Hello/ and $_ = join ' ', map { s/Hello,[23]/1/r } @F"