2013-04-26 58 views
3

为什么/ pattern/matching,但RegExp不是?Javascript new RegExp vs./pattern /和多行

<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

不是答案,但你错过了第二个正则表达式中的'?',第一个不需要转义'/'。 – 2013-04-26 15:06:13

+0

@FabrícioMatté谢谢,纠正它。 – 2013-04-26 15:10:32

回答

6

问题是这一行:

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

它应改为:

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

原因:明白了RegExp对象以一个String作为参数来构建你需要RegEx引擎正确解释\S\s的双重转义,以便\S应该变成\\S,在你的正则表达式中应该变成\\s

+1

只需添加。在一个字符串里面,'\ S'是一个无效的转义序列,被解释为'S'。所以你必须逃避转义字符才能直接使用它(因此是双重转义)。 – 2013-04-26 15:10:19

+1

谢谢,就是这样。 – 2013-04-26 15:11:38

+0

不客气,很高兴它为你工作。 – anubhava 2013-04-26 15:29:50