Prise en charge des expressions régulières multi-lignes dans Vim

117

Je remarque que la syntaxe standard de regex pour la correspondance sur plusieurs lignes consiste à utiliser / s, comme ceci:

This is\nsome text
/This.*text/s

Cela fonctionne en Perl par exemple, mais ne semble pas être pris en charge dans Vim. Au lieu de cela, je dois être beaucoup plus précis:

/This[^\r\n]*[\r\n]*text/

Je ne trouve aucune raison pour laquelle cela devrait être, donc je pense que j'ai probablement raté les éléments pertinents dans l'aide de vim.

Quelqu'un peut-il confirmer ce comportement d'une manière ou d'une autre?

Daniel
la source

Réponses:

177

Oui, le //smodificateur de Perl n'est pas disponible sur les expressions régulières Vim. Voir :h perl-patternspour plus de détails et une liste des autres différences entre les expressions régulières Vim et Perl.

Au lieu de cela, vous pouvez utiliser \_., ce qui signifie "correspondre à n'importe quel caractère, y compris la nouvelle ligne". C'est un peu plus court que ce que vous avez. Voir :h /\_..

/This\_.*text/
Brian Carper
la source
4
Bien - ma vie est devenue un peu plus facile. J'avais fait (. | \ N) *
ojrac
2
Qu'est-ce que la barre oblique dans le :h /\_.do? Je veux dire, je sais que ça marche, mais pourquoi ça :h /\_.marche, et non :h \_.?
Édité le
2
@Eddified la barre oblique (qui est la clé par défaut pour la recherche) spécifie le contexte dans \_.lequel vous pouvez lire comme: donnez-moi de l'aide pour l'expression de recherche \_.
Florian
Cependant, il semble que je ne puisse pas effectuer de correspondance paresseuse avec cette expression, même si je l'ai incluse entre parenthèses? Y a-t-il un moyen de le faire?
xji
2
@JIXiang Pour un match paresseux foo bar \n foo baz \n foo, essayez/foo\_.\{-}foo
James M. Lay