【发布时间】:2015-03-04 00:05:17
【问题描述】:
我正在使用正则表达式来匹配所有英国银行卡号格式;我进行了研究并设法找到/修改了涵盖大多数格式的正则表达式。但是,我有一个不匹配的边缘情况,我不知道为什么,或者如何解决。这就是我正在使用的:
(\b[4|5|6](\d){3}[\s|-]?((\d){4}[\s|-]?){2}(\d){4}\b)|(\b(\d){4}[\s|-]?(\d){6}[\s|-]?(\d){5}\b)
这是一个不起作用的示例卡号:6759000000005
这是一个有效的示例卡号:675900000000555
抱歉,如果这是一个简单的问题,我对正则表达式语法相当陌生。任何帮助解决将不胜感激。谢谢。
【问题讨论】:
-
你能举例解释一下银行卡号是什么意思吗?您正在寻找什么格式以及为什么上面的正则表达式不适用于示例?
-
您最好使用Luhn check。仅仅因为一张卡匹配一个正则表达式,并不意味着它是一个有效的数字,因为它必须计算校验位。
-
理想情况下我们会使用 Luhn 检查,但不幸的是,对于这个解决方案,我们只能使用正则表达式。我们做了很多测试,正确提取这个数字的成功率很高。我希望我可以修改当前的正则表达式并使其适用于我提供的第一个示例卡号。
-
快速回答:您的正则表达式查找 15 或 16 个字符长的数字。您的第一个示例是 13 个字符长,这就是它无法工作的原因。您可以使用正则表达式中的重复来在匹配中使用最小值和最大值,例如
(\d{4,6})而不是(\d){6}。我不知道你是否真的在使用你的正则表达式的捕获组,但它们听起来很奇怪,可能会被简化。 -
[\s|-]表示:space 或 pipe 或 dash。您真的打算将|字符用作分隔符吗? (我问是因为无意中使用管道是一个常见错误)