2012-02-09 2 views
26

자바 스크립트에서 정규 표현식을 결합 할 수 있습니까? 예를 들어자바에서 정규 표현식 결합하기

:

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

두 개의 별도 정규식을 사용하고 있거나'/ [a-zA-Z] /'를 원하십니까? –

+0

나는 이것을 알고있다. 이것이 가능한지 알 필요가있다 –

+2

가능한 복제본 [Regexp] (http://stackoverflow.com/questions/869809/combine-regexp) –

답변

24

변수로 정규 표현식을 할당하고 정규 표현식

+1

@ AlanMoore 죄송합니다. 나중에이 문제를 살펴 보는 사람의 관심사로 해결하겠습니다. – Bry6n

+6

lower와 upper도 정규 표현식 리터럴 일 수 있습니다. – prasopes

16

regexps'에 미리 알 수없는 경우에 우리처럼 패턴 일치 문자를 사용하는 변수를 결합 할 수 있습니다! 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

이 작업은 한 두 번만하면됩니다. 다른 답변에서 제안한대로 케이스별로 처리하는 것이 좋습니다.

그러나 많은 작업을 수행해야하는 경우 몇 가지 도우미 기능을 사용하면 가독성이 향상 될 수 있습니다. 이 다소 더 만들고,

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)); 
}; 

대안은 비 캡처 그룹에 싸여과 분리 연산자와 결합 : 예를 들면 : 당신이 그 기능을 사용하려면

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); 

그리고 여기에 코드입니다 보다 복잡한 정규식에 대한 강력한 접근 방식.

도우미 기능을 호출하기 전에 앞에 코드를 포함해야합니다.