正则表达式匹配任何字符,包括新行

kur*_*uki 198 regex perl

是否有正则表达式匹配"包括换行符在内的所有字符"?

例如,在下面的正则表达式中,没有输出,$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;
Run Code Online (Sandbox Code Playgroud)

eph*_*ent 292

如果您不想添加/s正则表达式修饰符(也许您仍希望.在正则表达式的其他位置保留其原始含义),您还可以使用字符类.一种可能性:

[\S\s]
Run Code Online (Sandbox Code Playgroud)

一个不是空格或空间的角色......换句话说,任何角色.

您还可以在正则表达式的一小部分中本地更改修饰符,如下所示:

(?s:.)
Run Code Online (Sandbox Code Playgroud)

  • 新奇的+1.`\ d\D`,`\ w\W`也有效.=) (8认同)
  • +1我本来就要用`(?s:.)`语法编写. (2认同)
  • [\ S\s]适用于非perl正则表达式,即gedit (2认同)
  • `([\S\s]+)` 是我一直在寻找的。谢谢。+1 (2认同)

Bol*_*ock 176

s修饰符添加到正则表达式以使.匹配换行符:

$string =~ /(START)(.+?)(END)/s;
Run Code Online (Sandbox Code Playgroud)

  • 在JavaScript中:(开始)[\ s\S]*(结束) - 请访问www.regexpal.com进行测试 (27认同)
  • 在 Java 中,您可以在正则表达式的开头使用内联修饰符 (?s),例如,使用 `"(?s)yourPattern.*"` 替换 'yourPattern' 之后的任何字符(包括换行符) - 另请参阅:https:// /www.rexegg.com/regex-modifiers.html#dotall (2认同)

Jul*_*aar 30

这对我来说非常可读并且匹配“任何字符或换行符

(.|\n)*
Run Code Online (Sandbox Code Playgroud)

它的行为与

[\S\s]*
Run Code Online (Sandbox Code Playgroud)

和一样

(?s:.)*
Run Code Online (Sandbox Code Playgroud)

?另外,您还可以在末尾添加 a以使正则表达式急切(在第一个匹配处停止)(.|\n)*?

// Eager (stop on first match)
start_string(.|\n)*?end_string
Run Code Online (Sandbox Code Playgroud)

否则,只有正则(.|\n)*表达式是贪婪的,您最终可能会得到多个 end_string:

start_string some text
and newlines end_string
some more text end_string
Run Code Online (Sandbox Code Playgroud)


Fai*_*Dev 8

是的,你只需要制作.匹配换行符:

$string =~ /(START)(.+?)(END)/s;
Run Code Online (Sandbox Code Playgroud)