Чи сумісні магії регексу Vim із відомими класами регулярних виразів?


16

Багато синтаксисів регулярних виразів інструментів Unix часто кодифіковані POSIX-базовими та розширеними регулярними виразами (BRE та ERE відповідно), а в деяких сучасних реалізаціях - стиль Perl (PCRE - це реалізація цього).

Чи існує відповідність один до одного між рівнями магії Віма та такими зовнішньо визначеними, але добре відомими класами? Схоже, \mце BRE і \vє ERE, за винятком того, що POSIX не включає lookarounds.

Якщо таке листування існує, чи воно десь визначене? pattern.txtмає лише одну згадку про POSIX.

Або нам доводиться дотримуватися "магії", щоб описати регулярні вирази Vim?


3
Досить впевнено \vвключає <>межі слів, які AFAIK унікальні для Vim. Так ні, просто опишіть їх як "Vim regex". (Не публікую як відповідь, тому що я не позитивний)
Doorknob

@Doorknob, я думаю, що вам може бути цікавим таке обговорення відповідей та коментарів . Оскільки ваш коментар має три оновлення, і жоден коментар не відповів би на те, що він невірний, він, ймовірно, правильний (я не впевнений), але пропонуються зміни тощо. ін. неможливо підвищити його точність. Як опубліковану відповідь, її можна було відредагувати для покращення точності, звернення, прихильність, відповідь тощо.
Wildcard

Відповіді:


22

Підсумовуючи, немає. Регекс Vim - це унікальний аромат, і немає варіантів, щоб змусити його вести себе як інший аромат.

Я думаю, що це гарна річ.

Магія

Цей 'magic'параметр не змінює аромат регулярного виразу, який використовує Vim. Він просто перевертає поведінку багатьох \атомів, що ухиляються.

Наприклад, за замовчуванням +є буквальним +символом, де \+означає "один або більше попереднього атома". На відміну від цього, *означає "нуль або більше попереднього атома", а \*є буквальним *. Багато людей вважають це досить заплутаним. Використання \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(, використовуючи буквальне (.

Вiм власний аромат регексу

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

Неможливо в PCRE

Орієнтування - це загальна особливість, де ви можете стверджувати, що візерунок не відповідає або не відповідає шаблону, який ви намагаєтеся зіставити. Наприклад, шаблон PCRE q(?!u)(або Vge regex pattern qu\@!) відповідає а q, за яким не слідує a u. (Це правильніше, ніж те q[^u], що вимагає, щоб після символу був якийсь символ q.)

Відстань негативної змінної довжини

PCRE та багато інших ароматів мають обмеження, що негативний вигляд візерунка повинен мати фіксовану довжину. Це означає, що такий зразок (?<![a-z]{3})foo, що означає "рядок, якому foo не передують рівно 3 маленькі літери"), добре, але (?<![a-z]+)foo(маючи на увазі "рядок, якому fooне передує жодна кількість малих літер"), це не так.

Це обмеження не існує у Vim. У Vim такий малюнок \([a-z]\+\)\@<!foo, хоча, можливо, трохи негарний для погляду, цілком справедливий.

Простіше у Vim regex

Деякі речі набагато приємніші в ароматі виге Виге.

Початок і кінець якоря для матчу

На мою думку, найбільш помітними є \zsі \zeякір. Вони дозволяють вказати початок і кінець матчу. Наприклад, foo(\zs.*\ze)відповідає лише тому, що між функцією дзвінка (та )у функціональному виклику foo(...). Це можна зробити за допомогою PCRE, але це вимагає використання способу пошуку, який є трохи стомлюючим:(?<=foo\().*(?=\))

Збірка префіксів

Ще одна прикольна річ, яку може зробити Vim - це узгодження будь-якого префікса (включаючи порожній префікс) певної послідовності символів. Наприклад, відповідно до f, fo, fooабо food, шаблон f\%[ood]може бути використаний. У PCRE виглядатиме така модель f(o(od?)?)?. (Уявіть, що для більш тривалої струни!)

Відповідність позицій курсору, рядка та стовпця

Регекс Vim має кілька якорів для узгодження позицій у буфері.


Я думаю, що варто втримати час від Vim в ароматі регексу. Він добре підходить для використання в текстовому редакторі, який використовується в основному для програмування, і він досить потужний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.