JavaScript中的new RegExp与/pattern/以及多行匹配

3
为什么/pattern/能匹配,但是RegExp不行呢?
<div id="foo">
##content##
<h1>works!</h1>
##/content##
</div>

<script>
var str = document.getElementById("foo").innerHTML;
console.log(str);

var r = new RegExp("##content##([\S\s]*)##\/content##", "img");

console.log(r.exec(str)); //null
console.log(str.match(/##content##([\S\s]*)##\/content##/img)); //matches
</script>

1
不是答案,但是你在第二个正则表达式中漏了 ? ,而第一个不需要转义 / - Fabrício Matté
1个回答

6
问题出在这一行:
var r = new RegExp("##content##([\S\s]*?)##\/content##", "img");

应该用以下内容来代替:
var r = new RegExp("##content##([\\S\\s]*?)##\/content##", "img");
原因:了解 RegExp 对象需要一个字符串作为参数进行构造,您需要双重转义 \S\s 才能被正则表达式引擎正确解释,所以 \S 应该变成 \\S,而 \s 应该变成 \\s 在您的正则表达式中。

1
只是补充一下。在字符串内部,\S 是一个无效的转义序列,会被解释为 S。因此,您必须转义转义字符以字面使用它(这就是双重转义的原因)。 - Fabrício Matté

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