Регулярное выражение с 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"

Попробуй это

/"[^"]+,3"/

вместо. https://regex101.com/r/4rXN4z/1

повествовательный

Другие вопросы по тегам