2011-11-28 15 views
134

Czy istnieje wyrażenie regularne pasujące do "wszystkich znaków, w tym znaków nowej linii"?Regex pasujący do dowolnej postaci, w tym nowe linie

Na przykład w poniższym wyrobie nie ma danych wyjściowych z $2, ponieważ (.+?) nie uwzględnia nowych linii podczas dopasowywania.

$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

Możesz przeczytać o regex modyfikatory/flagi takich jak: M, S (m/regex/IMS. ..) – snoofkin

Odpowiedz

121

Dodaj s modifier do regex spowodować . dopasować nowe linie:

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

W JavaScript: (START) [\ s \ S] * (END) - Zobacz stronę www.regexpal.com, aby przetestować – Zymotik

+1

Aby uzyskać więcej informacji dotyczących komentarza @ Zymotik, zobacz: http://stackoverflow.com/questions/1068280/javascript -regex-multiline-flag-doesnt-work –

-2

Chcesz użyć "wielowierszowego".

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

Nie, 'm' wpływa na kotwice'^'i' $ ', ale nie' .'. – BoltClock

+0

Interesujące, dzięki. Chyba nigdy nie próbowałem robić dokładnie tego, o co prosi OP. – nadime

5

yeap, po prostu trzeba zrobić . mecz nowalinia:

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

+1 za spóźnienie o 16 sekund. =) – TLP

+0

@TLP lol Dzięki :) – FailedDev

198

Jeśli nie chcesz dodać modyfikator regex /s (może nadal chcesz, aby . zachowało swoje pierwotne znaczenie w innym miejscu w regex), może również użyć klasy znaków. Jedna z możliwości:

[\S\s] 

postać, która nie jest przestrzenią lub jest przestrzenią ... innymi słowy, dowolną postacią.

Można również zmienić modyfikatory lokalnie w niewielkiej części regex, tak:

(?s:.) 
+2

+1 Właśnie miałem zamiar zaimplementować składnię '(? S:.)'. – BoltClock

+7

+1 za nowość. '\ d \ D',' \ w \ W' również działają. =) – TLP

+2

[\ S \ s] działa na wyrażeń regularnych innych niż "perl", tzn. Gedit –

Powiązane problemy