2012-02-09 111 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)); 
}; 

的替代品被包裹在非捕獲組,並用脫節操作相結合,使之成爲一個較爲更復雜的正則表達式的魯棒方法。

請注意,您需要在之前包含此代碼調用輔助函數!