11

この質問を読みましたが、Discoverカードの場合、開始桁は6011, 622126-622925, 644-649, 65単なるではありません6011, 65。(出典

ディスカバーカードの場合、私はその質問からこの正規表現を選びました^6(?:011|5[0-9]{2})[0-9]{12}$

私はそれをカバーするように変更しました、6011そして、しかし、のために、正規表現を構築することは私の貧弱な正規表現スキルの難しい理由です。644-64965622126-622925

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

622126-622925ケース間のみを受け入れるように変更するにはどうすればよい622***ですか?

4

3 に答える 3

15

これがあなたの正規表現です(デモ)

^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アルゴリズムを使用して、クレジットカード番号が有効かどうかを確認する必要があります。理論的には正規表現を使用してこれを行うことができますが、これよりも何倍も悪くなります。


私がどのようにしてこの怪物にたどり着いたかを段階的にお見せしましょう。まず、これらの各範囲をどのように一致させるかを次に示します。

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

上記の最終製品は、以前の正規表現を少しコンパクトにしたものであり、グループを非キャプチャーにしました(これ?:が目的です)。

于 2012-11-21T19:44:58.693 に答える
0

Here are your options:

  1. Hack your way through it and build a really complicated regex. Regexes are not suited for this sort of integer comparison so what you come up with will necessarily be long, uncomplicated and unmaintainable. See Regex for number check below a value and similar SO questions on this topic.
  2. Use integer comparison in your code.

For reference one such said complicated regex would be

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

于 2012-11-21T19:35:59.803 に答える
0

このチケットでさえ3年前ですが、同じタスクに遭遇し、622126-622925の正規表現を共有したいと思います:)

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

ゼロ幅の負のルックビハインドを使用して、予期しない数を除外します

于 2016-06-30T08:47:52.287 に答える