如何在regex.exec()中使用dotall标志

21
我希望获取多行字符串中包含特定字符的字符串,并且我想获取两个特定字符串之间的内容。我使用了这个正则表达式,它可以工作,但如果内容包含任何字符(\r \n \t),它就无法工作并返回空值。
This Wotked
    var regex = new RegExp("\-{2}Head(.*)-{2}\/\Head");      
    var content = "--Head any Code and String --/Head";
    var match = regex.exec(content);

这不起作用

var regex = new RegExp("\-{2}Head(.*)-{2}\/\Head");      
var content = "--Head \n any Code \n and String --/Head";
var match = regex.exec(content);

我发现了一个正则表达式工具(http://www.regexr.com/v1/),我知道应该在多行字符串中使用Dotall,但我无法在regex.exec中使用Dotall。
谢谢。
4个回答

35

2018年,随着部分浏览器实现ECMA2018标准,JS正则表达式现在支持s DOTALL修饰符

浏览器支持情况

console.log("foo\r\nbar".match(/.+/s)) // => "foo\r\nbar"

实际上,JS原生的match-all-characters正则表达式构造

[^]

它表示匹配任何不为空的字符。其他正则表达式语言会因为不完整的字符类而产生警告或异常(演示),但在JavaScript中将完全有效(演示)。

事实上,[^]并不是可移植的,因此除非您只想让代码在JS上运行,否则不建议使用。

regex = /--Head([^]*)--\/Head/

如果你想让JS和Java中的所有字符都匹配同一模式,那么需要使用其他答案中所示的解决方法:在重视可移植性时,使用包含两个相反的简写字符类的字符类:[\w\W][\d\D][\s\S](最常用)。

注意,[^]更短。


2
太好了!它正常工作了。这一定是正确的答案。@HapyUser请将被接受的答案更改为这个。 - Rotem
1
非常好,我在这里真正找到了一个很好的答案! - Remi Guan

28

JavaScript不支持s(dotall)修饰符。唯一的解决方法是使用“捕获所有”类,如[\s\S]代替点:

regex = new RegExp("\-{2}Head([\\s\\S]*)-{2}\/\Head")

还要注意,您的表达式可以使用文字直接表示更简洁:

regex = /--Head([\s\S]*)--\/Head/

这已经不再是真实的情况了。 - user3064538

2

使用万能字符类[\s\S],它表示空格或非空格。

var regex = new RegExp("\-{2}Head([\s\S]*)-{2}\/\Head","m");      
var content = "--Head \n any Code \n and String --/Head";
var match = regex.exec(content);

1
您正在寻找“s”修饰符,也称为“dotall”修饰符,它强制点号“.”匹配换行符。在中不存在dotall修饰符。解决方法是将点号“.”替换为...
[\S\s]*

您的正则表达式应该是这样的。
var regex = /-{2}Head([\S\s]*)-{2}\/Head/

1
此答案已过时。 - Dan Dascalescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接