Регулярное выражение с Perl, ungreedy не работает, как ожидалось
Может ли кто-нибудь объяснить мне, почему это не работает:
# 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"
Я намеревался заменить / найти только "Hello,3"/"Hello,2", но кажется, что не жадный модификатор (или мой мозг) работает не так, как ожидалось.
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"
2016-11-25 09:24