319 votes

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

Existe-t-il une expression rationnelle pour faire correspondre "tous les caractères, y compris les nouvelles lignes"?

Par exemple, dans les expressions rationnelles ci-dessous, il n'y a pas de sortie de $2 car (.+?) 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;
 

435voto

ephemient Points 87003

Si vous ne souhaitez pas ajouter le modificateur /s regex (peut-être souhaitez-vous toujours que . conserve sa signification d'origine ailleurs dans la regex), vous pouvez également utiliser une classe de caractères. Une possibilité:

 [\S\s]
 

un caractère qui n'est ni un espace ni 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 rationnelle, comme ceci:

 (?s:.)
 

243voto

BoltClock Points 249668

Ajoutez le modificateur s à votre expression rationnelle pour que . corresponde aux nouvelles lignes:

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

10voto

FailedDev Points 15104

Oui, vous avez juste besoin de faire correspondre . newline:

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

-6voto

nadime Points 97

Vous voulez utiliser "multiligne".

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X