Sublime Text regex no detecta etiquetas multilínea

130

Tengo esta expresión regular aquí;

\[sometag\](.*)\[/sometag\]

Que se supone que atrapa el texto rodeado por la [sometag]etiqueta. Funciona para la información de una sola línea contenida en estas etiquetas, como en la cadena [sometag]this is a bit of text[/sometag]. Pero no funciona en texto que abarca varias líneas, como esta;

[sometag] here is more text

it spans more than one line [/sometag]

Por alguna razón, el buscador de expresiones regulares de Sublime text no reconocerá las etiquetas en varias líneas. Quiero saber si esto es un problema con Sublime Text, una opción que se puede alternar o simplemente mi incompetencia personal con expresiones regulares.

Maurdekye
fuente

Respuestas:

240

Al principio, use un modificador dotall (?s)para hacer que el punto coincida también con los caracteres de nueva línea.

(?s)\[sometag\](.*?)\[\/sometag\]

MANIFESTACIÓN

Avinash Raj
fuente
¡Gracias! ¿Por qué tengo que incluir esos signos de interrogación adicionales?
Maurdekye
8
?después *hará un partido no codicioso. Considere [b]foo[/b]foo[b]bar[/b]como ejemplo. \[b\].*\[\/b\]coincidiría con el conjunto desde el inicio b hasta el último cierre b.
Avinash Raj
solo juegue con agregar y quitar ?en este regex101.com/r/gI0xC3/2
Avinash Raj
11
(? s) hace que el punto también incluya nuevas líneas
cmroanirgo
3
el signo de interrogación después del asterisco es importante ya que define la coincidencia como no codiciosa.
andrej
12

Si la modificación del modo de punto es inadmisible por alguna razón, puede tomar eso:

[sometag](.|\n)+?[/sometag]
SynCap
fuente
3
Nunca lo use (.|\n)+?si tiene acceso al modificador DOTALL. Si no puede usar (?s)en algo de mal gusto, use [\s\S]/ [\d\D]/ [\w\W], pero no el patrón de alternancia sugerido aquí. Este patrón es altamente ineficiente y puede conducir fácilmente a un problema de tiempo de espera.
Wiktor Stribiżew
1
@ WiktorStribiżew: ¿Puedes explicar por qué es ineficiente? Siempre uso [\s\S], pero de un vistazo (.|\n)parece equivalente? ¿Tiene que ver con grupos coincidentes? Pero entonces (?:.|\n)sería lo mismo?
Cerberus