Regex para que coincida con cualquier personaje, incluidas las nuevas líneas

223

¿Hay una expresión regular que coincida con "todos los caracteres, incluidas las nuevas líneas"?

Por ejemplo, en la expresión regular a continuación, no hay salida de $2porque (.+?)no incluye nuevas líneas cuando coinciden.

$string = "START Curabitur mollis, dolor ut rutrum consequat, arcu nisl ultrices diam, adipiscing aliquam ipsum metus id velit. Aenean vestibulum gravida felis, quis bibendum nisl euismod ut. 

Nunc at orci sed quam pharetra congue. Nulla a justo vitae diam eleifend dictum. Maecenas egestas ipsum elementum dui sollicitudin tempus. Donec bibendum cursus nisi, vitae convallis ante ornare a. Curabitur libero lorem, semper sit amet cursus at, cursus id purus. Cras varius metus eu diam vulputate vel elementum mauris tempor. 

Morbi tristique interdum libero, eu pulvinar elit fringilla vel. Curabitur fringilla bibendum urna, ullamcorper placerat quam fermentum id. Nunc aliquam, nunc sit amet bibendum lacinia, magna massa auctor enim, nec dictum sapien eros in arcu. 

Pellentesque viverra ullamcorper lectus, a facilisis ipsum tempus et. Nulla mi enim, interdum at imperdiet eget, bibendum nec END";

$string =~ /(START)(.+?)(END)/;

print $2;
kurotsuki
fuente
1
Es posible que desee leer sobre modificadores / indicadores de expresiones regulares como: m, s (m / regex / ims ...)
snoofkin

Respuestas:

194

Agregue el smodificador a su expresión regular para .que coincida con las nuevas líneas:

$string =~ /(START)(.+?)(END)/s;
BoltClock
fuente
32
En JavaScript: (INICIO) [\ s \ S] * (FIN) - Vea www.regexpal.com para probar
Zymotik
1
Para obtener más información sobre el comentario de @ Zymotik, consulte: stackoverflow.com/questions/1068280/…
Jacob van Lingen
2
En Java, puede usar el modificador en línea (? S) al comienzo de la expresión regular, por ejemplo, para reemplazar cualquier carácter, incluidas las nuevas líneas después del uso de 'yourPattern' "(?s)yourPattern.*". Consulte también: rexegg.com/regex-modifiers.html#dotall
LukeSolar
En Ruby, el modificador es m, no s. Ver: rubular.com
Jon Schneider
312

Si no desea agregar el /smodificador de expresiones regulares (tal vez aún desee .conservar su significado original en otra parte de la expresión regular), también puede usar una clase de caracteres. Una posibilidad:

[\S\s]

un personaje que no es un espacio o es un espacio. En otras palabras, cualquier personaje.

También puede cambiar los modificadores localmente en una pequeña parte de la expresión regular, así:

(?s:.)
efímero
fuente
2
+1 Yo mismo estaba a punto de incorporar la (?s:.)sintaxis.
BoltClock
¿Es (?:.|\n)inferior de alguna manera, excepto ser menos elegante?
Vlastimil Ovčáčík
([\S\s]+)es lo que estaba buscando Gracias. +1
Ryan
@ VlastimilOvčáčík Ese puede ser realmente malo para el tiempo de ejecución si lo usa con *o +dado que hay 2 ^ n formas diferentes en que puede coincidir con una cadena dada de longitud n.
Radon Rosborough
8

Yeap, solo necesitas hacer .coincidir la nueva línea:

$string =~ /(START)(.+?)(END)/s;
FailedDev
fuente
-5

Desea usar "multilínea".

$string =~ /(START)(.+?)(END)/m;
nadime
fuente
66
No, mafecta a las anclas ^y $pero no ..
BoltClock
Interesante, gracias. Supongo que nunca he intentado hacer exactamente lo que me pide el OP.
nadime