Ancres "Zoom"
En plus de la réponse de @ jecxjo, il existe de nombreuses situations où vous pouvez utiliser les ancres de largeur nulle \zs
et \ze
au lieu d'une recherche positive. Ces ancres définissent le début ( \zs
) et la fin ( \ze
) de la correspondance dans le motif complet.
Exemples
foo\zsbar
correspondra bar
précédé de foo
( foo
ne fait pas partie du match)
foo\zebar
correspondra foo
suivi de bar
( bar
ne fait pas partie du match)
myFunction(\zs.*\ze)
correspondra aux paramètres dans un appel de fonction (à des fins de démonstration, je ne me concentre pas sur la correspondance cupide vs non gourmande)
Mettre à profit
Ceux-ci deviennent plus utiles lors de l'utilisation de la :substitute
commande. Par exemple, disons que je voulais remplacer les paramètres d'un appel de fonction myFunction()
par foo
:
:%s/myFunction(\zs.*\ze)/foo/
Cela laissera myFunction(
et )
intact, et vous n'avez pas à vous soucier de les capturer dans votre modèle ou les répéter dans votre remplacement .
Vous pouvez le faire en utilisant la fonction de lookaround du regex de Vim, mais c'est assez maladroit:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(Je trouve que cette syntaxe me fait oublier ce que j'essayais de faire en premier lieu.)
Vous avez toujours besoin de regarder parfois
Il y a encore des situations où vous avez besoin de regarder autour. L'utilisation de \zs
et \ze
est idéale pour les situations simples où vous avez quelque chose avant suivi d'un texte à faire correspondre suivi de quelque chose après . Mais si c'est plus complexe que cela, vous devrez probablement vous en tenir à la syntaxe de recherche plus lourde.
Fait amusant
Bien qu'ils soient considérablement plus laids, les contournements de Vim sont plus puissants que ceux de PCRE! Ils prennent en charge la recherche négative de longueur variable, ce qui signifie que vous pouvez affirmer qu'un modèle dont la longueur n'est pas prédéterminée n'est pas avant votre match.
PCRE ne prend pas en charge cela, car il est assez coûteux en termes de calcul. Ce n'est pas une préoccupation majeure dans Vim, car les cas d'utilisation les plus courants de l'expression régulière ont tendance à impliquer une recherche interactive où le temps de calcul est presque imperceptible pour l'utilisateur. Vous le remarquerez probablement s'il était utilisé pour la mise en évidence de la syntaxe.
Rubriques d'aide pertinentes
:help \zs
:help \ze
:help perl-patterns
Il semble que cela soit possible. Il existe un tableau simple pour passer de perl à vim.
:h perl-patterns
Ainsi, par exemple, si vous avez la chaîne
one two three
et que vous ne souhaitez faire correspondreone
que si la<space>two
suit, vous pouvez utiliserCeci est similaire à la version Perl
la source