2012-02-09 9 views
26

JavaScriptで正規表現を組み合わせることは可能ですか? EXのためにJavascriptでの正規表現の組み合わせ

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

すなわち。私は、答えはイエスです

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

var one_or_two = new RegExp("(" + one.source + ")|(" + two.source + ")") 
+0

2つの別々の正規表現がありますか、 '/ [a-zA-Z] /'だけが必要ですか? –

+0

私はそれを知っています....これが可能かどうかを知る必要があります –

+2

[Combine Regexp](http://stackoverflow.com/questions/869809/combine-regexp)の可能な複製 –

答えて

24

、変数への正規表現を割り当てて、正規表現

+1

@AlanMoore申し訳ありませんが、後でこれを見ている人のために修正します。 – Bry6n

+6

lowerとupperは正規表現のリテラルでもかまいません。 – prasopes

16

正規表現が事前に知られていない場合に 我々がそうであるように、パターンマッチング文字を使用してこれらの変数を組み合わせることができます!変数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); 
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)); 
}; 

選択肢が非キャプチャグループで包み、論理和演算子と組み合わせて、この幾分作っていますより複雑な正規表現のための強力なアプローチ。

の前に、のヘルパー機能を呼び出す必要があります。