2013-04-26 21 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