2012-02-09 113 views
26

是否可以在javascript中组合正则表达式。在Javascript中结合正则表达式

对于前:

var lower = /[a-z]/; 
var upper = /[A-Z]/; 
var alpha = upper|lower;//Is this possible? 

即。我可以指定正则表达式的变量和使用模式匹配字符在正则表达式

+0

你有两个单独的正则表达式还是只想'/ [a-zA-Z] /'? – 2012-02-09 15:05:06

+0

我知道....我需要知道这是否可能 – 2012-02-09 15:07:09

+2

[Combine Regexp](http://stackoverflow.com/questions/869809/combine-regexp) – 2012-02-09 21:12:10

回答

24

答案是肯定的!您必须初始化RegExp类下的变量:

var lower = new RegExp(/--RegexCode--/); 
var upper = new RegExp(/--RegexCode--/); 

因此,可以动态创建正则表达式。创建后:

"sampleString".replace(/--whatever it should do--/); 

然后,你可以将它们正常结合,是的。

var finalRe = new RegExp(lower.source + "|" + upper.source); 
+1

@AlanMoore对不起,我会修复它,以利于任何人在以后看看这个。 – Bry6n 2012-02-10 03:12:55

+6

下部和上部也可以是正则表达式文字。 – prasopes 2014-08-13 10:04:24

16

如果正则表达式是事先不知道这些结合变量作为 我们这样做,

var one = /[a-z]/; 
var two = /[A-Z]/; 

var one_or_two = new RegExp("(" + one.source + ")|(" + two.source + ")") 
2
alpha = new RegExp(lower.source + "|" + upper.source); 
console.log(alpha); 
// /[a-z]|[A-Z]/ 
5

如果这是你唯一需要做一次或两次,我会用做在每个案例基础上通过其他的答案中所建议的坚持。

但是,如果您需要做很多工作,一些辅助函数可能会提高可读性。例如:

var lower = /[a-z]/, 
    upper = /[A-Z]/, 
    digit = /[0-9]/; 

// All of these are equivalent, and will evaluate to /(?:a-z)|(?:A-Z)|(?:0-9)/ 
var anum1 = RegExp.any(lower, upper, digit), 
    anum2 = lower.or(upper).or(digit), 
    anum3 = lower.or(upper, digit); 

而这里的代码,如果你想使用这些功能:

RegExp.any = function() { 
    var components = [], 
     arg; 

    for (var i = 0; i < arguments.length; i++) { 
     arg = arguments[i]; 
     if (arg instanceof RegExp) { 
      components = components.concat(arg._components || arg.source); 
     } 
    } 

    var combined = new RegExp("(?:" + components.join(")|(?:") + ")"); 
    combined._components = components; // For chained calls to "or" method 
    return combined; 
}; 

RegExp.prototype.or = function() { 
    var args = Array.prototype.slice.call(arguments); 
    return RegExp.any.apply(null, [this].concat(args)); 
}; 

的替代品被包裹在非捕获组,并用脱节操作相结合,使之成为一个较为更复杂的正则表达式的鲁棒方法。

请注意,您需要在之前包含此代码调用辅助函数!