Экранирование символов в регулярном выражении (дописываем свой текст)

Рейтинг: 0Ответов: 1Опубликовано: 05.02.2015
(\d{1,3}\.){3}\d{1,3}:\d{2,5}

Можно сделать так, чтобы к найденному выражению по этому regex дописывался произвольный текст. Например:

127.0.0.1:8888@blalabla:blablabla

А не как сейчас:

127.0.0.1:8888

Ответы

▲ 1

Регулярные выражения не изменяют текст сами по себе. В большинстве движков есть операция замены текста, например, s/// в Perl, re.sub() в Python.

Чтобы добавить текст после шаблона, можно использовать \K: s/шаблон\K/добавка/, например, чтобы добавить @bla после ip:port во входном тексте:

$ echo 'a 127.0.0.1:8888 z' |
  perl -pe 's/(?:\d{1,3}\.){3}\d{1,3}\:\d{2,5}\K/\@bla/g'

Результат:

a 127.0.0.1:8888@bla z

Если библиотека регулярных выражений в данном языке не поддерживает \K, тогда можно использовать захват группы (c помощью ()) и ссылаться на группу с помощью $1, \1 в зависимости от regexp диалекта. Пример на Питоне:

$ echo 'a 127.0.0.1:8888 z' |
  python -c 'import re, sys; 
    print(re.sub(r"((?:\d{1,3}\.){3}\d{1,3}\:\d{2,5})", r"\1@bla", sys.stdin.read()))'

Тот же результат:

a 127.0.0.1:8888@bla z

Так как \K не используется, то в выражение для замены необходимо добавить \1, которое вставляет захваченную группу текста.