2011-02-23 158 views
72

如何構建兩個正則表達式模式?Javascript Regexp從變量動態生成?

例如我有一個較長的圖案和一個較小的圖案,我需要在較長的圖案前放一個較小的圖案。

var pattern1 = ':\(|:=\(|:-\('; 
var pattern2 = ':\(|:=\(|:-\(|:\(|:=\(|:-\(' 
str.match('/'+pattern1+'|'+pattern2+'/gi'); 

這是行不通的。當我連接字符串時,所有斜槓都消失了。

回答

130

你必須使用RegExp

str.match(new RegExp(pattern1+'|'+pattern2, 'gi')); 

當我連接字符串,所有斜線都不見了。

如果你有你的格局反斜線轉義特殊的正則表達式字符(如\(),您必須在字符串中使用反斜槓(因爲\是轉義字符的字符串):new RegExp('\\(')將與/\(/相同。

所以你的模式有可能成爲:

var pattern1 = ':\\(|:=\\(|:-\\('; 
var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\('; 
12

使用如下:

var regEx = new RegExp(pattern1+'|'+pattern2, 'gi'); 

str.match(regEx); 
+5

應該不是' '/''使用'新的RegExp(...)'時被刪除? –

+0

@BartKiers偉大的一點!常見的錯誤 ! x)值得在某處添加一個大通知:) –

6

你已經放棄了正則表達式字面和使用對象的構造函數,在那裏你可以通過正則表達式作爲串。

var regex = new RegExp(pattern1+'|'+pattern2, 'gi'); 
str.match(regex); 
1

RegExp構造函數創建一個正則表達式對象,用於將文本與模式進行匹配。

var pattern1 = ':\\(|:=\\(|:-\\('; 
    var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\('; 
    var regex = new RegExp(pattern1 + '|' + pattern2, 'gi'); 
    str.match(regex); 

上面的代碼工作完美的我...