JavaScript正则表达式如何从变量动态生成?

162

如何将两个正则表达式合并成一个?

例如,我有一个长的正则表达式和一个较短的正则表达式,我需要把较短的正则表达式放在较长的正则表达式前面。

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

这不起作用。当我连接字符串时,所有的斜杠都消失了。

4个回答

283

你需要使用RegExp

str.match(new RegExp(pattern1+'|'+pattern2, 'gi'));
当我在拼接字符串时,所有的反斜杠都会消失。
如果你在模式中有一个反斜杠用于转义特殊的正则表达式字符(如\(),那么你必须在字符串中使用两个反斜杠(因为\是字符串中的转义字符):new RegExp('\\(')将与/\(/相同。
所以你的模式应该变成:
var pattern1 = ':\\(|:=\\(|:-\\(';
var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\(';

35

使用以下代码:

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

str.match(regEx);

9
使用 new RegExp(...) 时,'/' 应该被移除吗? - Bart Kiers
@BartKiers 很好的观点!常见错误!x) 值得在某个地方添加一个大的提示 :) - jave.web

21
你必须放弃正则表达式字面量并使用对象构造器,这样你可以将正则表达式作为字符串传递。
var regex = new RegExp(pattern1+'|'+pattern2, 'gi');
str.match(regex);

4
RegExp 构造函数创建一个正则表达式对象,用于在文本中匹配模式。
    var pattern1 = ':\\(|:=\\(|:-\\(';
    var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\(';
    var regex = new RegExp(pattern1 + '|' + pattern2, 'gi');
    str.match(regex);

上述代码对我来说完全可行...


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