Regex pour correspondre à n'importe quel caractère, y compris les nouvelles lignes


223

Existe-t-il une expression rationnelle pour faire correspondre "tous les personnages, y compris les retours à la ligne"?

Par exemple, dans l'expression régulière ci-dessous, il n'y a pas de sortie de $2car (.+?)n'inclut pas de nouvelles lignes lors de la correspondance.

$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;

1
Vous voudrez peut-être lire sur les modificateurs / indicateurs regex tels que: m, s (m / regex / ims ...)
snoofkin

Réponses:


194

Ajoutez le smodificateur à votre expression régulière pour faire .correspondre les nouvelles lignes:

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

32
En JavaScript: (START) [\ s \ S] * (END) - Voir www.regexpal.com pour tester
Zymotik

1
Pour plus d'informations concernant le commentaire de @ Zymotik, voir: stackoverflow.com/questions/1068280/…
Jacob van Lingen

2
En Java, vous pouvez utiliser le modificateur en ligne (? S) au début de l'expression régulière, par exemple pour remplacer tout caractère, y compris les sauts de ligne après l'utilisation de «votre modèle» "(?s)yourPattern.*"- Voir également: rexegg.com/regex-modifiers.html#dotall
LukeSolar

Dans Ruby, le modificateur ne l'est mpas s. Voir: rubular.com
Jon Schneider

312

Si vous ne voulez pas ajouter le /smodificateur regex (peut-être voulez-vous toujours .conserver sa signification d'origine ailleurs dans l'expression régulière), vous pouvez également utiliser une classe de caractères. Une possibilité:

[\S\s]

un personnage qui n'est pas un espace ou qui est un espace. En d'autres termes, n'importe quel caractère.

Vous pouvez également changer les modificateurs localement dans une petite partie de l'expression régulière, comme ceci:

(?s:.)

2
+1 J'étais sur le point d'intégrer la (?s:.)syntaxe moi-même.
BoltClock

Est-il (?:.|\n)inférieur de quelque façon que ce soit, sauf s'il est moins élégant?
Vlastimil Ovčáčík

([\S\s]+)c'est ce que je cherchais. Merci. +1
Ryan

@ VlastimilOvčáčík Celui-là peut être vraiment mauvais pour l'exécution si vous l'utilisez avec *ou +puisqu'il existe 2 ^ n façons différentes, il peut correspondre à n'importe quelle chaîne donnée de longueur n.
Radon Rosborough

8

Oui, il vous suffit de faire .correspondre la nouvelle ligne:

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

-5

Vous souhaitez utiliser "multiligne".

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

6
Non, maffecte les ancres ^et $mais pas ..
BoltClock

Intéressant, merci. Je suppose que je n'ai jamais essayé de faire exactement ce que le PO demande.
2011
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.