Может потребоваться, чтобы слово с шаблоном не начиналось с \
, используя отрицательный символьный класс
s{(?: ^|\s ) (?: [^\\\s]\S* )? \K foo}{XXX}gx
foo
также может находиться в начале строки, или слово,таким образом, чередование ^|\s
и [^\\\s]\S*
является необязательным.\
необходимо экранировать в классе символов, иначе он сам избежит ]
.
. \K
отбрасывает все совпадения до этой точки, поэтому нам не нужно захватывать их и помещатьих обратно.
Отрицательный взгляд позади не допускает паттерны переменной длины, в чем здесь проблема.
Test, с добавлением к вашей тестовой строке
perl -wE'$_=q(foo bar somefoo \bazfoo \barfoo foo bar \foobar); say;
s{(?: ^|\s ) (?: [^\\\s]\S* )? \K foo}{XXX}gx; say'
печатает
foo bar somefoo \bazfoo \barfoo foo bar \foobar
XXX bar someXXX \bazfoo \barfoo XXX bar \foobar
Обратите внимание, что ваша тестовая строка не включает случай, когда foo
внутри слова, но все еще нуждается в замене, как somefoo
.Я добавил это выше