Regex: Как мне заменить часть шаблона и ссылаться на переменную внутри него? - PullRequest
9 голосов
/ 18 января 2012

Я хочу сопоставить шаблон, заменить часть шаблона и использовать переменную в шаблоне как часть строки замены.

Это правильно?

/s/^((\s+)private\sfunction\s__construct\(\))/(2)def\s__init__

На английском языке: заменить любое количество пробелов, за которым следует строка "private function __construct()", тем же количеством пробелов и строкой def __init__.Итак, мое регулярное выражение плохо или что?

partial replace

Ответы [ 3 ]

13 голосов
/ 18 января 2012

Полагаю, вы хотите заменить его на vi

Заменить все вхождения

:s/^\(\s\+\)private function __construct()/\1def __init__/g

Заменить первым

:s/^\(\s\+\)private function __construct()/\1def __init__/

Несколько предложений по вашему шаблону

  • / используется в vi для поиска, используйте :
  • вам нужно сбежать ( ) в vi
  • используйте \i, где i - это x-я группа захвата, например \1 \2, для поддержки ссылочных сгруппированных шаблонов при замене
  • \s нельзя использовать для замены текста, используйте ' ' вместо
  • используйте трейлинг /g, если вы хотите заменить все вхождения

http://vimregex.com должно помочь вам начать работу.

6 голосов
/ 18 января 2012

Это называется обратной ссылкой, и вы используете \i для ссылки на i-ую захваченную группу из шаблона.

Так что для шаблона ^((\s+)private\sfunction\s__construct\(\)) замена - \2def __init__.

3 голосов
/ 23 января 2012

Не думаю, что кто-то действительно понял вопрос.По сути, я делаю это следующим образом:

"Если вы хотите найти шаблон замены, шаблон a, и замените его строкой замены, шаблон i, только если он начинается сшаблон, шаблон b, затем вам нужно включить шаблон b в строку замены, например:: / (шаблон b) (шаблон a) / (шаблон b) (i) / g ".

Этонемного многословно, но стоит прочитать.

В прошлом я уверен, что кто-то думал: «Это могло бы сэкономить много ресурсов, чтобы фактически не заменить pattern b на pattern b. Это избыточно«.Может быть, это происходит автоматически.Я не нашел встроенного метода в vi или любой другой программе для этого.Я уверен, что мог бы написать скрипт для этого.

...