使用perl的regexp,ungreedy没有按预期工作

时间:2016-11-25 09:20:08

标签: regex perl non-greedy

有人可以向我解释,为什么这不起作用:

# 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",但似乎非贪婪的修饰符(或我的大脑)不起作用如预期的那样。

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

试试这个

/"[^"]+,3"/

代替。 https://regex101.com/r/4rXN4z/1

Narrative