2011-02-09 6 views
9

텍스트 입력을 신용 카드 번호로 확인해야합니다.2 개의 정규 표현식을 논리 또는 "결합"할 수 있습니까?

  • 비자 : ^4[0-9]{12}(?:[0-9]{3})?$
  • 마스터 : ^([51|52|53|54|55]{2})([0-9]{14})$
  • 아메리칸 익스프레스 : ^3[47][0-9]{13}$

및 많은 다른 사람 나는 이미 다른 신용 카드에 대한 정규식이있다.

문제는 다른 사용자를 기반으로 다른 정규식을 사용하여 유효성을 검사하고 싶습니다. 예 : user1의 경우 Visa 및 Mastercard를 사용할 수 있으며 user2의 경우 Visa 및 American Express를 사용할 수 있습니다.

user1Regex = Visa regex + "||" + Mastercard regex 

user2Regex = Visa regex + "||" + American Express regex 

이 할 수있는 방법이 있나요 : 그래서 내가 좋아하는, 위의 하나 이상의 정규식 문자열을 결합하여 동적으로 최종 정규식 문자열을 생성 하시겠습니까? 고마워,

답변

13

같은 것입니다. 또한 더 빠른 실행 (비 캡처 그룹)에 대한 (?:)을 사용할 수 있습니다

var user1Regex = new RegExp('(' + Visaregex + ")|(" + Mastercardregex + ')'); 
// or if es6: 
let user1Regex = new RegExp(`(${Visaregex})|(${Mastercardregex})`); 

하지만 가독성을 위해 것을 생략 한 : 그냥 않습니다.

+0

+1 작동합니다 :)'('와 함께 작동 :? foo는 | bar)의'논리적 또는 문자열로 | multiple chars characters – n611x007

+0

나는 이것을 시험해 보았고, 'Visaregex'는 얇게 썰어 야합니다. 그렇지 않으면 슬래시가 문자 그대로 조합에 포함될 것입니다. 즉'Visaregex ==/ab + c /'와'Mastercardregex ==/de + f /'인 경우'user1Regex'는'/ (\/ab + c \ /) | (\/de + 우리가 원했던 것처럼'/ (ab + c) | (de + f) /'가 아닙니다. 그래서 나는 당신의 대답을 다음과 같이 바꿀 것이다 : let let user1Regex = new RegExp ($ {Visaregex.toString(). slice (1, -1)}) | ($ {Mastercardregex.toString(). slice (1, - 1)}) \');'. – chharvey

2

당신이 구현하는 데 사용하는 언어가 확실하지 않지만 하나의 |을 사용하여 논리적 또는 대부분의 정규식을 사용할 수 있습니다. 내 제안은 각 정규식을 문자열로 저장 한 다음 필요한 경우 연결하고 컴파일하는 것입니다.

파이썬에서 당신은 당신의 언어를 명시하지 않았지만, 어떤 이유에서 나는 그것이 자바 스크립트 용의자

visa = "visa_regex" 
mastercard = "mastercard_regex" 
combined = re.compile(visa + "|" + mastercard)
10

| 모든 parentesis()

^(4[0-9]{12}(?:[0-9]{3})?|([51|52|53|54|55]{2})([0-9]{14})|3[47][0-9]{13})$ 

와 운영자 및 그룹의 모든 정규식이 올바른 경우는 (`에 대한

+0

+1, 어쩌면'(? :)'이라고 메모 할 수 있습니까? – n611x007

관련 문제