Soporte de expresiones regulares multilínea en Vim

116

Noto que la sintaxis de expresiones regulares estándar para hacer coincidir varias líneas es usar / s, así:

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

Esto funciona en Perl, por ejemplo, pero no parece ser compatible con Vim. En cambio, tengo que ser mucho más específico:

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

No puedo encontrar ninguna razón por la que esto debería ser así, así que estoy pensando que probablemente me perdí las partes relevantes en la ayuda de vim.

¿Alguien puede confirmar este comportamiento de una forma u otra?

Daniel
fuente

Respuestas:

176

Sí, el //smodificador de Perl no está disponible en Vim regexes. Consulte los :h perl-patternsdetalles y una lista de otras diferencias entre las expresiones regulares de Vim y Perl.

En su lugar, puede usar \_., lo que significa "coincidir con cualquier carácter, incluido el salto de línea". Es un poco más corto de lo que tienes. Ver :h /\_..

/This\_.*text/
Brian Carper
fuente
4
Bien, mi vida se ha vuelto un poco más fácil. Estuve haciendo (. | \ N) *
ojrac
2
¿Qué hace la barra inclinada hacia adelante :h /\_.? Quiero decir, sé que funciona, pero ¿por qué :h /\_.funciona y no :h \_.?
Edificado el
2
@Eddified la barra inclinada (que es la clave predeterminada para la búsqueda) especifica el contexto del \_.cual se puede leer como: dame ayuda para la expresión de búsqueda \_.
Florian
Sin embargo, parece que no puedo realizar una comparación perezosa con esta expresión, incluso si la incluí entre paréntesis. ¿Hay alguna forma de hacerlo?
xji
2
@JIXiang Para un partido perezoso foo bar \n foo baz \n foo, intente/foo\_.\{-}foo
James M. Lay