2012-11-21 9 views
8

私はthis questionまで読んでいますが、Discoverカードでは、開始数字はではなく6011, 622126-622925, 644-649, 65です。 (SourceRegex for Discoverクレジットカード

出会うカードの場合、私は644-649 & 656011をカバーするために、それを変更したが622126-622925ため、建物の正規表現は、私の貧弱な正規表現のスキルのcuzのは困難である。その質問から^6(?:011|5[0-9]{2})[0-9]{12}$

をこの正規表現を拾いました

私はこの正規表現をこれまでのところ6(?:011|5[0-9]{2}|[4][4-9][0-9]|[2]{2}[1-9])[0-9]{2}$でしたが、それは622[1-9]**をチェックするだけです。

622126-622925622***の場合のみ受け付けるように変更するにはどうすればよいですか?ここで

+0

通常のDiscover Regexを使用して、次の行でより読みやすい方法でチェックを実行できますか? –

+0

正規表現以外の数値比較を使用するだけの理由はありませんか? – djechlin

+0

@YuriyFaktorovich申し訳ありませんがあなたを取得していません。あなたは上記の質問を書式化するか、2つのステップでそれに取り組むことを意味しますか?後者の場合、私はそれのための単一の正規表現を好むでしょう。 – Ashfame

答えて

9

があなたの正規表現(demo)だことだろうと述べ1:回答

^6(?:011\d{12}|5\d{14}|4[4-9]\d{13}|22(?:1(?:2[6-9]|[3-9]\d)|[2-8]\d{2}|9(?:[01]\d|2[0-5]))\d{10})$ 

言うまでもなく、私はまさにこれはかなりか簡単呼び出しません維持する。数値を整数として解析し、プログラミング言語を使ってチェックを行うことをお勧めします。あなたはは、理論的には、正規表現でこれを行うことができながら、

ます。また、クレジットカード番号が有効であるかどうかを確認するためにLuhn algorithmを使用し、必要があり、それはこれより多くの時間が悪化します。


私は、この怪物にどのようにして到着したかを段階的に示してもらうことができます。まず、ここにあなたがそれらの範囲のそれぞれに合致する方法である:

6011  # matches 6011 
65   # matches 65 
64[4-9]  # matches 644-649 
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5])) 
      # matches 622126-622925 

、あなたは数字の残りの部分を合わせたい:

6011\d{12}  # matches 6011 + 12 digits 
65\d{14}   # matches 65 + 14 digits 
64[4-9]\d{13}  # matches 644-649 + 13 digits 
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10} 
        # matches 622126-622925 + 10 digits 

今、あなたはすべての4つを組み合わせて、開始と終了を追加することができます行のアンカー:

^(     # match start of string and open group 
6011\d{12}|  # matches 6011 + 12 digits 
65\d{14}|   # matches 65 + 14 digits 
64[4-9]\d{13}|  # matches 644-649 + 13 digits 
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10} 
        # matches 622126-622925 + 10 digits 
)$     # close group and match end of string 

上記最終生成物は、前の正規表現のわずかに圧縮されたバージョンであり、Iはまた、(すなわち、それら?:をするためのもので何)基、非捕捉ました。

+0

神聖なshmoly!今私はそれが私の理解の点を超えて複雑になっているのを見ます。私はちょうどそれを整数として解析し、 '622126-622925'の場合と比較することで動作させました。これを私に説明してくれてありがとうNerdlordに感謝します! :D – Ashfame

+0

@Ashfameはい、正規表現の範囲は実用的ではありません。私が言ったように、あなたはまた、チェックデジットが正しいことを確認する必要があります。それは正規表現を使ってはならないものです。 – NullUserException

+0

はいサー!私はそれのための場所でLuhnアルゴリズムのためのjQueryの検証プラグインを持っています。 – Ashfame

0

は、あなたのオプションは次のとおりです。

  1. は、それを通してあなたの方法をハックして、本当に複雑な正規表現を構築します。正規表現はこの種の整数比較には適していないので、あなたが思いつくものは必然的に長く、複雑ではなく、維持不能である。このトピックに関するRegex for number check below a valueとそれに類似した質問を参照してください。
  2. コードで整数比較を使用します。参考のため

、このような複雑な正規表現は、ここで

62212[6-9]|6221[3-9]|622[1-8]|62291|62292[1-5]

0

も、このチケットは3年前ですが、私は同じタスクが発生しない見込み数を除外するために、ゼロ幅の負の後読みを使用して622126から622925 :)

^(622[1-9]\\d(?<!10|11|9[3-9])\\d(?<!12[0-5]|92[6-9])\\d{10})$ 

のための正規表現を共有したいと思います

関連する問題