Regexuj, aby dopasować dowolny znak, w tym nowe linie

223

Czy istnieje wyrażenie pasujące do „wszystkich znaków, w tym nowych linii”?

Na przykład w poniższym wyrażeniu regularnym nie ma danych wyjściowych, $2ponieważ (.+?)nie zawiera nowych wierszy 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;
kurotsuki
źródło
1
Możesz przeczytać o modyfikatorach / flagach
wyrażeń

Odpowiedzi:

194

Dodaj smodyfikator do wyrażenia regularnego, .aby dopasować znaki nowej linii:

$string =~ /(START)(.+?)(END)/s;
BoltClock
źródło
32
W JavaScript: (START) [\ s \ S] * (END) - Sprawdź www.regexpal.com w celu przetestowania
Zymotik
1
Aby uzyskać więcej informacji dotyczących komentarza @ Zymotik, zobacz: stackoverflow.com/questions/1068280/...
Jacob van Lingen
2
W Javie możesz użyć wbudowanego modyfikatora (? S) na początku wyrażenia regularnego, na przykład, aby zastąpić dowolny znak, w tym nowe znaki po użyciu wyrażenia „yourPattern” "(?s)yourPattern.*"- zobacz także: rexegg.com/regex-modifiers.html#dotall
LukeSolar
W Ruby modyfikatorem mnie jest s. Zobacz: rubular.com
Jon Schneider
312

Jeśli nie chcesz dodawać /smodyfikatora wyrażenia regularnego (być może nadal chcesz .zachować jego oryginalne znaczenie w innym miejscu wyrażenia regularnego), możesz również użyć klasy znaków. Jedna możliwość:

[\S\s]

postać, która nie jest spacją lub jest spacją. Innymi słowy, każda postać.

Możesz także zmienić modyfikatory lokalnie w niewielkiej części wyrażenia regularnego, na przykład:

(?s:.)
efemeryczny
źródło
2
+1 Właśnie chciałem wkomponować się w (?s:.)składnię.
BoltClock
Czy (?:.|\n)pod jakimkolwiek względem jest gorszy, poza tym, że jest mniej elegancki?
Vlastimil Ovčáčík
([\S\s]+)tego szukałem. Dzięki. +1
Ryan
@ VlastimilOvčáčík Ten może być naprawdę zły dla środowiska wykonawczego, jeśli używasz go z *lub +ponieważ istnieją 2 ^ n różne sposoby, aby dopasować dowolny podany ciąg długości n.
Radon Rosborough
8

Tak, po prostu musisz .dopasować nowy wiersz:

$string =~ /(START)(.+?)(END)/s;
FailedDev
źródło
-5

Chcesz użyć „multilinii”.

$string =~ /(START)(.+?)(END)/m;
nadime
źródło
6
Nie, mwpływa na ^i $zakotwiczenia, ale nie ..
BoltClock
Ciekawe dzięki. Chyba nigdy nie próbowałem zrobić dokładnie tego, o co prosi OP.
nadime