Discover 信用卡的正则表达式

标签 regex

我已通读 this question ,但对于 Discover 卡,起始数字是 6011, 622126-622925, 644-649, 65而不仅仅是 6011, 65 . ( Source )

对于 Discover 卡,我从那个问题中选择了这个正则表达式 ^6(?:011|5[0-9]{2})[0-9]{12}$
我修改它以覆盖 6011 , 644-649 & 65但对于 622126-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***案件?

最佳答案

这是您的正则表达式 (demo) :

^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

现在您可以组合所有四个,并添加行尾 anchor :
^(                  # 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

上面的最终产品是先前正则表达式的稍微压缩版本,我还使组不可捕获(这就是 ?: 的用途)。

关于Discover 信用卡的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500648/

相关文章:

php - preg_replace 如何仅替换选择器内匹配的 xxx($1)yyy 模式

python - 新手的 Python 正则表达式列表?

php - 使用 checkdnsrr 验证电子邮件,是好还是坏的解决方案?

python - 需要这个 scrapy 正则表达式的帮助

python - 按非连续大写字母拆分字符串

c# - 正则表达式:匹配短语中的所有单词

javascript - 选择不是开始于但结束于之间的所有内容

MySQL REGEXP - 列包含正则表达式

javascript - Spotify 网址正则表达式

php - Preg_match_all 和 javascript 数组