Совместимы ли магические выражения Vim с известными классами регулярных выражений?

16

Синтаксисы регулярных выражений многих инструментов Unix часто представляют собой POSIX-кодированные базовые и расширенные регулярные выражения (BRE и ERE, соответственно) и, в некоторых современных реализациях, в стиле Perl (PCRE является реализацией этого).

Существует ли однозначное соответствие между уровнями магии Вима и такими внешне определенными, но хорошо известными классами? Похоже, \mэто BRE и \vERE, за исключением того, что POSIX не включает обходные пути.

Если такое соответствие существует, определено ли оно где-нибудь? pattern.txtесть только одно упоминание о POSIX.

Или мы должны придерживаться "магии", чтобы описать регулярные выражения Vim?

Мур
источник
3
Уверен, \vвключает в себя <>границы слов, которые AFAIK является уникальным для Vim. Так что нет, просто опишите их как "Vim Regex". (Не отправлять как ответ, потому что я не уверен)
Дверная ручка
@ Doorknob, я думаю, что вы могли бы найти это обсуждение ответов как комментарии интересным. Поскольку ваш комментарий содержит три отзыва и ни одного комментария, сообщающего вам, что он неправильный, он, вероятно, правильный (я не уверен), но предложил правки et. и др. невозможно улучшить его точность. Как опубликованный ответ, он может быть отредактирован для повышения точности, голосования, отрицания, ответа и т. Д.
Wildcard

Ответы:

22

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

Я думаю, что это хорошо.

магия

'magic'Вариант не изменяет вкус регулярных выражений , что Вим использует. Он просто переворачивает поведение многих \-экранированных атомов.

Например, по умолчанию +это буквальный +символ, где \+означает «один или несколько предшествующих атомов». Напротив, *означает «ноль или более предшествующего атома», хотя \*является литералом *. Многие люди находят это довольно запутанным. Использование \vв вашем шаблоне делает его более последовательным. :help 'magic'дает хорошее резюме:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

Лично я думаю, что поведение по умолчанию хорошо для файлов кода, где не редкость возможность поиска таких вещей, как foo(использование литерала (.

Собственный вкус регулярного выражения Vim

Я видел много людей, желающих, чтобы Vim поддержал PCRE. Лично я хотел бы, чтобы другие инструменты поддерживали привкус Vim. У него есть некоторые возможности, которые либо невозможно, либо слишком громоздки для достижения в PCRE.

Невозможно в PCRE

Lookaround - это общая функция, где вы можете утверждать, что шаблон либо не соответствует, либо не совпадает до или после шаблона, который вы пытаетесь сопоставить. Например, шаблон PCRE q(?!u)(или шаблон регулярного выражения Vim qu\@!) соответствует a q, за которым не следует a u. (Это более правильно, чем 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 есть несколько якорей для сопоставления позиций в буфере.


Я думаю, что стоит принять вкус регулярных выражений Vim. Он хорошо подходит для использования в текстовом редакторе, используемом в основном для программирования, и он довольно мощный.

tommcdo
источник