2011-11-28 50 views
134

是否有匹配「包括換行符在內的所有字符」的正則表達式?正則表達式匹配包括新行在內的任何字符

例如,在下面的正則表達式中,$2沒有輸出,因爲(.+?)匹配時不包含新行。

$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

您可能想了解正則表達式修飾符/標誌,如:M,S(M /正則表達式/ IMS。 ..) – snoofkin

回答

121

添加s modifier到您的正則表達式來引起.匹配換行符:

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

在JavaScript中:(開始)[\ s \ S] *(結束) - 請訪問www.regexpal.com以測試 – Zymotik

+1

有關@ Zymotik評論的更多信息,請參閱:http://stackoverflow.com/questions/1068280/javascript -regex-multiline-flag-doesnt-work –

-2

你想使用「多行」。

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

不,'m'影響'^'和'$'錨,但不是'.'。 – BoltClock

+0

有趣,謝謝。猜猜我從來沒有試過做OP的要求。 – nadime

5

葉氏,你只需要做出.匹配換行符:

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

+1遲到16秒。 =) – TLP

+0

@TLP哈哈謝謝:) – FailedDev

198

如果你不這樣做想要添加/s正則表達式修飾符(也許你仍然希望.在正則表達式的其他地方保留它的原始含義),你也可能使用角色類。一種可能性:

[\S\s] 

特點,它不是一個空間或者是一個空間......換句話說,任何字符。

您還可以更改修飾局部的正則表達式的一小部分,像這樣:

(?s:.) 
+2

+1我正要用自己的'(?s:。)'語法芯片。 – BoltClock

+7

+1爲新奇。 '\ d \ D','\ w \ W'也可以工作。 =) – TLP

+2

[\ S \ s]適用於非perl正則表達式,即gedit –

相關問題