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