2011-11-28 10 views
134

Esiste una regex per la corrispondenza di "tutti i caratteri, incluse le nuove righe"?Regex per adattarsi a qualsiasi carattere incluse le nuove righe

Ad esempio, nell'espressione regolare di seguito, non viene emesso alcun output da $2 perché (.+?) 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; 
+0

Si consiglia di leggere i modificatori/bandiere quali: m, s (m/regex/IMS. ..) – snoofkin

risposta

121

Aggiungere il s modifier al regex per causare . da abbinare a capo:

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

In JavaScript: (START) [\ s \ S] * (FINE) - Vedi www.regexpal.com per provare – Zymotik

+1

Per ulteriori informazioni sul commento di @ Zymotik, vedere: http://stackoverflow.com/questions/1068280/javascript -regex-multiline-flag-doesnt-work –

-2

Si desidera utilizzare "multilinea".

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

No, 'm' influenza le ancore'^'e' $ 'ma non' .'. – BoltClock

+0

Interessante, grazie. Credo di non aver mai provato a fare esattamente quello che l'OP sta chiedendo. – nadime

5

yeap, non vi resta che fare . partita a capo:

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

+1 per essere in ritardo di 16 secondi. =) – TLP

+0

@TLP lol Grazie :) – FailedDev

198

Se non lo fai vuoi aggiungere il modificatore di espressioni regolari /s (forse vuoi ancora che il . mantenga il suo significato originale altrove nella regex), tu può anche usare una classe di caratteri. Una possibilità:

un carattere che non è uno spazio o è uno spazio ... in altre parole, qualsiasi carattere.

È anche possibile modificare i modificatori a livello locale in una piccola parte della regex, in questo modo:

(?s:.) 
+2

+1 Stavo proprio per fare il chip con la sintassi '(? S:.)' Di me stesso. – BoltClock

+7

+1 per la novità. '\ d \ D',' \ w \ W' funziona anche. =) – TLP

+2

[\ S \ s] funziona su espressioni regolari non perl, ad esempio gedit –

Problemi correlati