首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于发现信用卡的Regex

用于发现信用卡的Regex
EN

Stack Overflow用户
提问于 2012-11-22 03:27:41
回答 3查看 5.6K关注 0票数 11

我已经读过this question了,但是Discover卡的起始数字是6011, 622126-622925, 644-649, 65,而不仅仅是6011, 65。(Source)

对于Discover卡,我从问题^6(?:011|5[0-9]{2})[0-9]{12}$中选择了这个正则表达式

我对它进行了修改,以涵盖6011644-64965,但对于622126-622925,构建正则表达式是困难的,因为我的正则表达式技能很差。

到目前为止,我有这个正则表达式6(?:011|5[0-9]{2}|[4][4-9][0-9]|[2]{2}[1-9])[0-9]{2}$,但它只检查622[1-9]**

如何修改它,使其只接受用于622***622126-622925之间的大小写?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-22 03:44:59

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

代码语言:javascript
运行
复制
^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来检查信用卡号是否有效,虽然理论上可以使用正则表达式来做这件事,但它会比这糟糕很多倍。

请允许我一步一步地向你展示我是如何到达这个怪物的。首先,下面是如何匹配这些范围:

代码语言:javascript
运行
复制
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

现在,您想要匹配其余的数字:

代码语言:javascript
运行
复制
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

现在,您可以将这四个组合在一起,并添加线的起点和终点锚点:

代码语言:javascript
运行
复制
^(                  # 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

上面的最终产品是前一个正则表达式的略微压缩的版本,并且我还将组设为非捕获(这就是那些?:的用途)。

票数 14
EN

Stack Overflow用户

发布于 2012-11-22 03:36:00

以下是您的选择:

  1. 破解它并构建一个非常复杂的正则表达式。正则表达式不适合这种整数比较,所以你得到的结果必然是冗长的、简单的和不可维护的。有关此主题,请参阅Regex for number check below a value和类似的SO问题。
  2. 在代码中使用整数比较。

作为参考,一个这样的复杂正则表达式将是

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

票数 0
EN

Stack Overflow用户

发布于 2016-06-30 16:47:52

即使这张票是3年前的,我也遇到了同样的任务,我想分享一个622126-622925的正则表达式:)

代码语言:javascript
运行
复制
^(622[1-9]\\d(?<!10|11|9[3-9])\\d(?<!12[0-5]|92[6-9])\\d{10})$

它使用零宽度负回溯来排除不期望的数字

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13500648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档