Синтаксисы регулярных выражений многих инструментов Unix часто представляют собой POSIX-кодированные базовые и расширенные регулярные выражения (BRE и ERE, соответственно) и, в некоторых современных реализациях, в стиле Perl (PCRE является реализацией этого).
Существует ли однозначное соответствие между уровнями магии Вима и такими внешне определенными, но хорошо известными классами? Похоже, \m
это BRE и \v
ERE, за исключением того, что POSIX не включает обходные пути.
Если такое соответствие существует, определено ли оно где-нибудь? pattern.txt
есть только одно упоминание о POSIX
.
Или мы должны придерживаться "магии", чтобы описать регулярные выражения Vim?
\v
включает в себя<>
границы слов, которые AFAIK является уникальным для Vim. Так что нет, просто опишите их как "Vim Regex". (Не отправлять как ответ, потому что я не уверен)Ответы:
В итоге нет. Регулярное выражение Vim - это уникальный аромат, и нет никаких вариантов, чтобы заставить его вести себя как другой аромат.
Я думаю, что это хорошо.
магия
'magic'
Вариант не изменяет вкус регулярных выражений , что Вим использует. Он просто переворачивает поведение многих\
-экранированных атомов.Например, по умолчанию
+
это буквальный+
символ, где\+
означает «один или несколько предшествующих атомов». Напротив,*
означает «ноль или более предшествующего атома», хотя\*
является литералом*
. Многие люди находят это довольно запутанным. Использование\v
в вашем шаблоне делает его более последовательным.:help 'magic'
дает хорошее резюме:Лично я думаю, что поведение по умолчанию хорошо для файлов кода, где не редкость возможность поиска таких вещей, как
foo(
использование литерала(
.Собственный вкус регулярного выражения Vim
Я видел много людей, желающих, чтобы Vim поддержал PCRE. Лично я хотел бы, чтобы другие инструменты поддерживали привкус Vim. У него есть некоторые возможности, которые либо невозможно, либо слишком громоздки для достижения в PCRE.
Невозможно в PCRE
Lookaround - это общая функция, где вы можете утверждать, что шаблон либо не соответствует, либо не совпадает до или после шаблона, который вы пытаетесь сопоставить. Например, шаблон PCRE
q(?!u)
(или шаблон регулярного выражения Vimqu\@!
) соответствует aq
, за которым не следует au
. (Это более правильно, чемq[^u]
, что требует наличия некоторого символа послеq
.)Переменная длина отрицательный взгляд позади
У PCRE и многих других разновидностей есть ограничение, согласно которому шаблон с отрицательным внешним видом должен иметь фиксированную длину. Это означает, что шаблон типа
(?<![a-z]{3})foo
«строка, которойfoo
не предшествуют ровно 3 строчные буквы») - это хорошо, но(?<![a-z]+)foo
(что означает «строка, которойfoo
не предшествует любое количество строчных букв») - нет.Это ограничение не существует в Vim. В Vim такой шаблон, на который
\([a-z]\+\)\@<!foo
, возможно, немного некрасиво смотреть, вполне допустим.Проще в Vim regex
Некоторые вещи намного приятнее во вкусе регулярных выражений Vim.
Начало и конец матча якоря
Наиболее заметными, на мой взгляд, являются
\zs
и\ze
якоря. Это позволяет вам указать начало и конец матча. Например,foo(\zs.*\ze)
соответствует только то, что находится между(
и)
в вызове функции, какfoo(...)
. Это можно сделать в PCRE, но это требует использования lookaround, что немного утомительно:(?<=foo\().*(?=\))
Соответствие префикса
Еще одна интересная вещь, которую может сделать Vim, - сопоставить любой префикс (включая пустой префикс) определенной последовательности символов. Например, в соответствии с
f
,fo
,foo
илиfood
, шаблонf\%[ood]
может быть использован. В PCRE такой шаблон будет выглядеть такf(o(od?)?)?
. (Вообразите это для более длинной последовательности!)Соответствующие позиции курсора, строки и столбца
В регулярном выражении Vim есть несколько якорей для сопоставления позиций в буфере.
\%23c
соответствует столбцу 23\%<23c
совпадения перед столбцом 23\%>23c
совпадения после столбца 23\%16l
соответствует линии 16\%#
соответствует позиции курсораЯ думаю, что стоит принять вкус регулярных выражений Vim. Он хорошо подходит для использования в текстовом редакторе, используемом в основном для программирования, и он довольно мощный.
источник