Комментарий «немного быстрее» точен в том смысле, что бухгалтерия должна быть немного меньше, но акцент делается на «немного», а не «быстрее». Обычно, материал, соответствующий \(pattern\)
, должен быть сохранен, чтобы вы могли использовать \3
(для соответствующего номера), чтобы ссылаться на него при замене. Обозначение %
означает, что vim
не должен отслеживать матч, поэтому он выполняет немного меньше работы.
@ SimpleQuestions спрашивает:
Что вы подразумеваете под «следить за матчем»? Как это влияет на скорость?
Вы можете использовать экранированные скобки для «захвата» частей сопоставленного шаблона. Например, предположим, что мы играем с простыми объявлениями функций C - без указателей на функции или другие источники круглых скобок - тогда у нас может быть команда замены, такая как следующее:
s@\<\([a-zA-Z_][a-zA-Z_0-9]*\)(\([^)]*\))@xyz_\1(int nargs) /* \2 */@
Учитывая строку ввода, такую как:
int simple_function(int a, char *b, double c)
Вывод будет:
int xyz_simple_function(int nargs) /* int a, char *b, double c */
(Зачем вам это нужно? Я представляю, что мне нужно обернуть функцию C simple_function
, чтобы ее можно было вызывать из языка, скомпилированного в C, который использует другое соглашение об интерфейсе - он основан на Informix 4GL, если быть точным, я использую его для примера - не потому, что вам действительно нужно знать, почему это было хорошее изменение.)
Теперь в этом примере \1
и \2
в тексте замены относятся к захваченным частям регулярного выражения - имени функции (последовательности буквенно-цифровых символов, начинающихся с буквенного символа - считая подчеркивание как 'буквенный ') и список аргументов функции (все в скобках, но не в скобках).
Если бы я использовал обозначение \%(....\)
вокруг идентификатора функции, тогда \1
будет ссылаться на список аргументов и не будет \2
. Поскольку vim
не нужно было бы отслеживать одну из двух захваченных частей регулярного выражения, у него чуть меньше бухгалтерии, чем если бы он должен был отслеживать две захваченные части. Но, как я уже сказал, разница крошечная; Вы, вероятно, никогда не сможете измерить это на практике. Вот почему в руководстве написано «это позволяет большему количеству групп»; если вам нужно сгруппировать части вашего регулярного выражения, но вам не нужно снова обращаться к ним, тогда вы можете работать с более длинными регулярными выражениями. Однако к тому времени, когда у вас есть более 9 запомненных (захваченных) частей регулярного выражения, ваш мозг, как правило, выполняет вращательные движения, и ваши пальцы все равно будут ошибаться - поэтому усилия обычно не стоят того. Но это, я думаю, аргумент для использования нотации \%(...\)
. Он соответствует нотации Perl (PCRE) (?:...)
для регулярного выражения без захвата.