2011-02-09 7 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 |バー)'論理的または文字列で|複数の文字文字 – n611x007

+0

私はこれをテストし、 'Visaregex'をスライスする必要があります。さもなければ、スラッシュは文字通り組み合わせに含まれます。つまり、 'Visaregex ==/ab + c /'と 'Mastercardregex ==/de + f /'の場合、 'user1Regex'は' /(\/ab + c \ /)|(\/de + /(ab + c)|(de + f)/ 'ではなく、私たちが望んでいたものと同じです。 ($ {Visaregex.toString()。slice(1、-1)})|($ {Mastercardregex.toString()。slice(1、 - )あなたの答えを変更します: 1)})\ ');'。 – chharvey

2

実装するためにどの言語を使用しているかはわかりませんが、1つの|を使用して論理的または大部分の正規表現を使用できます。私の提案は、各正規表現を文字列として格納し、必要に応じて連結してコンパイルすることです。

pythonでそれはあなたがあなたの言語を述べなかったが、何らかの理由で、私はそれがJavaScriptのだ疑い

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

関連する問題