2015-07-10 5 views
2

В какой-то текст мне нужно найти строку, которая может быть одним из followningобратная ссылка для захвата группы в Vim

foo#foo%foo 
foo#foo%bar 
foo#bar%foo 
foo#bar%bar 
bar#foo%foo 
bar#foo%bar 
bar#bar%foo 
bar#bar%bar 

Я мог бы написать регулярное выражение Искателя как этот

/\(foo\|bar\)#\(foo\|bar\)%\(foo\|bar\) 

, который прекрасно работает.

Но я хочу избежать дублирования групп захвата в контролере.

Если я пишу что-то вроде

/\(foo\|bar\)#\1%\1 

это соответствует только первому и последним возможным строкам я уже упоминал в начале.

В: Могу ли я ссылаться на предыдущую группу захвата, НЕ предыдущее совпадение?

+2

Нет, это не так, как регулярные выражения работы. – lcd047

+3

@ lcd047: Существует много диалектов регулярных выражений. Режимы Vim не работают. Вы можете сделать это в Oniguruma (механизм регулярного выражения Ruby), например ([rubular] (http://rubular.com/r/DR9vxPA3cv)) – Amadan

+0

@Amadan Вы также можете сделать это с помощью [perl regexps] (https: // regex101.com/r/aD2cM0/1) и, возможно, многие другие. Тем не менее, я считаю, что вопрос О был о Виме. Vim упоминается в заголовке сообщения, что довольно сложно пропустить. Была ли какая-то особая причина вывести из моего ответа, что я имею в виду что-то еще, кроме Vim regexps? – lcd047

ответ

1

Я полностью нуждаюсь в создании и повторном использовании суб-шаблонов и их повторном использовании, например @Amadan и @ lcd047 alludedto однако Vim не поддерживает такое поведение, о котором я знаю.

В качестве альтернативы вы можете использовать <c-f> при редактировании рисунка, чтобы открыть command-line-window. Внутри этого окна вы можете редактировать шаблон с помощью своих обычных команд Vim, например. daw, ct) и т. Д. Как только вы закончите, вы можете нажать <cr> и запустить команду поиска /.

Приятный эпизод Vimcast об этом: Refining search patterns with the command-line window.

Для получения дополнительной справки смотрите:

:h command-line-window 
:h q/ 
:h c_Ctrl-f 
+0

Yup, окно командной строки - чрезвычайно полезная функция, ее следует упомянуть чаще. На стороне примечание 'q?' Открывает одно и то же окно для поиска назад, а 'q:' открывает аналогичное окно для редактирования команд Ex. – lcd047