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 à \m
BRE et à \v
ERE, sauf que POSIX n'inclut pas les contournements.
Si une telle correspondance existe, est-elle définie quelque part? pattern.txt
n'a qu'une mention POSIX
.
Ou devons-nous nous en tenir à la «magie» pour décrire les expressions régulières de Vim?
\v
inclut 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)Réponses:
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\v
dans votre modèle le rend un peu plus cohérent.:help 'magic'
donne un bon résumé: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 Vimqu\@!
) correspond à unq
qui n'est pas suivi par unu
. (C'est plus correct queq[^u]
, ce qui nécessite qu'il y ait du caractère après leq
.)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înefoo
non précédée d' exactement 3 lettres minuscules") est correct, mais(?<![a-z]+)foo
(signifiant "la chaînefoo
non 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
\zs
et\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 commefoo(...)
. 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
,foo
oufood
, le modèlef\%[ood]
peut être utilisé. Dans PCRE, un tel modèle ressembleraitf(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.
\%23c
correspond à la colonne 23\%<23c
correspond avant la colonne 23\%>23c
correspond après la colonne 23\%16l
correspond à la ligne 16\%#
correspond à la position du curseurJe 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.
la source