2016-11-25 99 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"