Les magies de regex de Vim sont-elles compatibles avec les classes de regex bien connues?


16

De nombreuses syntaxes d'expression régulière des outils Unix sont souvent les expressions régulières de base et étendues codées POSIX (BRE et ERE, respectivement) et, dans certaines implémentations modernes, de style Perl (PCRE étant une implémentation de cela).

Existe-t-il une correspondance biunivoque entre les niveaux de magie de Vim et ces classes définies à l'extérieur, mais bien connues? Il ressemble à \mBRE et à \vERE, sauf que POSIX n'inclut pas les contournements.

Si une telle correspondance existe, est-elle définie quelque part? pattern.txtn'a qu'une mention POSIX.

Ou devons-nous nous en tenir à la «magie» pour décrire les expressions régulières de Vim?


3
Assurément, il \vinclut les <>limites des mots, ce qui AFAIK est unique à Vim. Alors non, décrivez-les simplement comme "regex de Vim". (Ne pas poster comme réponse parce que je ne suis pas positif)
Poignée de porte

@Doorknob, je pense que vous pourriez trouver cette discussion sur les réponses sous forme de commentaires intéressante. Puisque votre commentaire a trois votes positifs et aucun commentaire ne répond pour vous dire qu'il est incorrect, il est probablement correct (je ne suis pas sûr), mais des modifications suggérées et. Al. sont impossible d'améliorer sa précision. En tant que réponse publiée, il pourrait être édité pour une meilleure précision, voté, voté, répondu, etc.
Wildcard

Réponses:


22

En résumé, non. Le regex de Vim est une saveur unique, et il n'y a pas d'options pour le faire se comporter plus comme une autre saveur.

Je pense que c'est une bonne chose.

la magie

L' 'magic'option ne change pas la saveur des expressions régulières utilisées par Vim. Il inverse simplement le comportement de nombreux \atomes échappés.

Par exemple, par défaut, +est un +caractère littéral , où \+signifie "un ou plusieurs des atomes précédents". En revanche, *signifie "zéro ou plus de l'atome précédent", tandis que \*est un littéral *. Beaucoup de gens trouvent cela assez déroutant. L'utilisation \vdans votre modèle le rend un peu plus cohérent. :help 'magic'donne un bon résumé:

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'

Personnellement, je pense que le comportement par défaut est agréable pour les fichiers de code, où il n'est pas rare de rechercher des choses comme foo(, en utilisant le littéral (.

Saveur regex propre à Vim

J'ai vu de nombreuses personnes souhaiter que Vim soutienne PCRE. Personnellement, je souhaite que d'autres outils prennent en charge la saveur des expressions régulières de Vim. Il a certaines capacités qui sont soit impossibles soit trop lourdes à réaliser dans PCRE.

Impossible dans PCRE

Le lookaround est une fonctionnalité courante où vous pouvez affirmer qu'un modèle correspond ou ne correspond pas avant ou après le modèle que vous essayez de faire correspondre. Par exemple, le modèle PCRE q(?!u)(ou modèle d'expression régulière Vim qu\@!) correspond à un qqui n'est pas suivi par un u. (C'est plus correct que q[^u], ce qui nécessite qu'il y ait du caractère après le q.)

Aspect négatif de longueur variable

PCRE, et beaucoup d'autres saveurs, ont une restriction selon laquelle un motif de lookbehind négatif doit être d'une longueur fixe. Cela signifie qu'un modèle comme (?<![a-z]{3})foo, signifiant "la chaîne foo non précédée d' exactement 3 lettres minuscules") est correct, mais (?<![a-z]+)foo(signifiant "la chaîne foonon précédée d' un nombre quelconque de lettres minuscules") ne l'est pas.

Cette restriction n'existe pas dans Vim. Dans Vim, un modèle comme \([a-z]\+\)\@<!foo, bien que peut-être un peu moche à regarder, est parfaitement valide.

Plus facile dans Vim regex

Certaines choses sont beaucoup plus agréables dans la saveur des expressions régulières de Vim.

Ancres de début et de fin de match

Les plus notables, à mon avis, sont les ancres \zset \ze. Ceux-ci vous permettent de spécifier le début et la fin du match. Par exemple, foo(\zs.*\ze)ne correspond qu'à ce qui se trouve entre le (et )dans un appel de fonction comme foo(...). Cela peut être fait dans PCRE, mais cela nécessite l'utilisation de lookaround, ce qui est légèrement fastidieux:(?<=foo\().*(?=\))

Correspondance de préfixe

Une autre chose intéressante que Vim peut faire est de faire correspondre n'importe quel préfixe (y compris le préfixe vide) d'une séquence particulière de caractères. Par exemple, pour correspondre à f, fo, fooou food, le modèle f\%[ood]peut être utilisé. Dans PCRE, un tel modèle ressemblerait f(o(od?)?)?. (Imaginez cela pour une chaîne plus longue!)

Correspondance des positions du curseur, de la ligne et de la colonne

L'expression régulière de Vim a quelques ancres pour faire correspondre les positions dans le tampon.


Je pense que cela vaut la peine d'embrasser la saveur des regex de Vim. Il est bien adapté pour une utilisation dans un éditeur de texte utilisé principalement pour la programmation, et il est assez puissant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.