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

时间:2014-05-04 11:19:49

标签: javascript regex

我希望得到一个多行字符串中的字符串,该字符串包含任何特定字符,并且我希望介于两个特定的凝视之间。

我使用了这个正则表达式和这个工作,但如果内容有任何字符(\ 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作为多行字符串,但我不能使用dotall来表示regex.exec

感谢。

4 个答案:

答案 0 :(得分:26)

javascript不支持s(dotall)修饰符。唯一的解决方法是使用“catch all”类,例如[\s\S]而不是点:

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

另请注意,您的表达式可以使用文字更简洁地编写:

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

答案 1 :(得分:22)

2018年,暂时在某些浏览器中实施了ECMA2018标准,JS regex现在支持s DOTALL modifier



JPA




实际上, JS本地匹配所有字符正则表达式构造

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

这意味着 匹配任何非 的字符。由于字符类不完整(demo),其他正则表达式会产生警告或异常,但它对JavaScript(demo)完全有效。

事实是,[^] 不可移植,因此不推荐使用,除非您希望代码仅在JS上运行。

[^]

要使相同的模式匹配JS中的任何字符,比如Java,您需要使用其他答案中说明的变通方法:可移植性<时,使用带有两个相反速记字符类的字符类/ strong>是关键regex = /--Head([^]*)--\/Head/ [\w\W][\d\D](最常用)。

请注意[\s\S]更短

答案 2 :(得分:3)

您正在寻找s修饰符,也称为 dotall 修饰符,它会强制点.也匹配换行符。 dotall修饰符 不存在于中。解决方法是将点.替换为...

[\S\s]*

你的正则表达式看起来像这样。

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

答案 3 :(得分:2)

使用catch all character class [\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);