2011-02-23 86 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); 

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