Regex per abbinare qualsiasi personaggio comprese le nuove linee


224

Esiste una regex per abbinare "tutti i personaggi comprese le nuove linee"?

Ad esempio, nella regex di seguito, non c'è output da $2perché (.+?)non include nuove righe durante la corrispondenza.

$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
Potresti voler leggere su modificatori / flag regex come: m, s (m / regex / ims ...)
snoofkin

Risposte:


195

Aggiungi il smodificatore al regex per far .corrispondere le nuove righe:

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

32
In JavaScript: (START) [\ s \ S] * (END) - Vedi www.regexpal.com per testare
Zymotik

1
Per maggiori informazioni sul commento di @ Zymotik, vedere: stackoverflow.com/questions/1068280/…
Jacob van Lingen,

2
In Java è possibile utilizzare il modificatore (?) Inline all'inizio del regex, ad esempio per sostituire qualsiasi carattere incluse le nuove linee dopo l'uso di 'yourPattern' "(?s)yourPattern.*"- Vedi anche: rexegg.com/regex-modifiers.html#dotall
LukeSolar

In Ruby, il modificatore è mno s. Vedi: rubular.com
Jon Schneider il

312

Se non vuoi aggiungere il /smodificatore regex (forse vuoi comunque .conservare il suo significato originale altrove nella regex), puoi anche usare una classe di caratteri. Una possibilità:

[\S\s]

un personaggio che non è uno spazio o è uno spazio. In altre parole, qualsiasi personaggio.

Puoi anche modificare i modificatori localmente in una piccola parte della regex, in questo modo:

(?s:.)

2
+1 Stavo per entrare con la (?s:.)sintassi da solo.
BoltClock

È (?:.|\n)inferiore in qualche modo, tranne essere meno elegante?
Vlastimil Ovčáčík

([\S\s]+)è quello che stavo cercando. Grazie. +1
Ryan,

@ VlastimilOvčáčík Che uno può essere davvero dannoso per il runtime se lo usi con *o +poiché ci sono 2 ^ n modi diversi che può corrispondere a una determinata stringa di lunghezza n.
Radon Rosborough,

8

Sì, devi solo .abbinare la nuova riga:

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

-5

Vuoi usare "multilinea".

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

6
No, mcolpisce le ^e $ancore, ma non ..
BoltClock

Interessante, grazie. Suppongo che non ho mai provato a fare esattamente ciò che l'OP sta chiedendo.
nadime,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.