"Zoom" якоря
В дополнение к @ jecxjo отвечают, есть много ситуаций , в которых можно использовать в нулевой ширины якоря \zs
и \ze
вместо положительного lookaround. Эти привязки определяют начало ( \zs
) и конец ( \ze
) совпадения в полном шаблоне.
Примеры
foo\zsbar
будет соответствовать bar
предшествует foo
( foo
не является частью матча)
foo\zebar
будет соответствовать с foo
последующим bar
( bar
не является частью матча)
myFunction(\zs.*\ze)
будет соответствовать параметрам в вызове функции (в демонстрационных целях я не фокусируюсь на сопоставлении с жадным алгоритмом или без сопоставления)
Положить его на использование
Они становятся наиболее полезными при использовании :substitute
команды. Так , например, сказать , что я хотел , чтобы заменить параметры в вызове функции , чтобы myFunction()
с foo
:
:%s/myFunction(\zs.*\ze)/foo/
Это оставит myFunction(
и )
нетронутое, и вам не придется беспокоиться о захвате их в шаблоне или повторять их в замене .
Вы можете сделать это, используя особенность регулярных выражений Vim, но это довольно неуклюже:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(Я считаю, что этот синтаксис заставляет меня забыть, что я пытался сделать в первую очередь.)
Вы все еще иногда нуждаетесь в уходе
Есть еще ситуации, когда нужно искать обходной путь. Использование \zs
и \ze
отлично подходит для простых ситуаций, когда у вас есть что-то перед тем, как следовать тексту, после чего следует что-то после . Но если это сложнее, вам, вероятно, придется придерживаться более сложного синтаксиса.
Забавный факт
Несмотря на то, что они выглядят значительно хуже, взгляды Vim более мощные, чем в PCRE! Они поддерживают отрицательный внешний вид переменной длины, что означает, что вы можете утверждать, что некоторый шаблон, длина которого не определена, находится не перед вашим соответствием.
PCRE не поддерживает это, поскольку это довольно дорого в вычислительном отношении. В Vim это не большая проблема, так как наиболее распространенные случаи использования регулярных выражений, как правило, включают интерактивный поиск, когда время вычислений практически незаметно для пользователя. Вы, вероятно, заметите это, если использовать его для подсветки синтаксиса.
Соответствующие разделы справки
:help \zs
:help \ze
:help perl-patterns
Похоже, это возможно. Существует простая таблица для перехода от perl к vim.
:h perl-patterns
Так, например, если у вас есть строка,
one two three
и вы хотите сопоставитьone
только если<space>two
следует, вы можете использоватьЭто похоже на версию Perl
источник