【问题标题】:Regular expression for all bank card numbers所有银行卡号的正则表达式
【发布时间】: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|-] 表示:spacepipedash。您真的打算将| 字符用作分隔符吗? (我问是因为无意中使用管道是一个常见错误)

标签: regex banking


【解决方案1】:

here the demo

正则表达式是(\b[4|5|6]\d{3}[\s-]?(\d{4}[\s-]?){2}\d{1,4}\b)|(\b\d{4}[\s-]?\d{6}[\s-]?\d{5}\b)

我不是英国卡片的专家,所以我不知道预期的格式是什么,因为您没有给出带有空格或连字符的示例... 如果您可以细化需求,它是可以处理的。

更通用的卡号验证(没有分隔符,因此您需要先剥离它们)

\d{6}\d{1,12}\d

按照规范的要求(账户标识符的最小长度一无所获):

ISO/IEC 7812 卡号的长度通常为 16 位,[1] 并且最多可以是 19 位数字。结构如下:

六位数的发行人识别号 (IIN)(以前称为 “银行识别号”(BIN))的第一位是 主要行业标识符 (MII),可变长度(最多 12 位) 个人帐户标识符,使用计算的单个校验位 Luhn 算法。[2]

【讨论】:

  • 感谢您的帮助和信息。不过看演示,正则表达式与 6759000000005 不匹配?
  • 是的,因为它有 13 个字符长,我不确定分隔符最初的位置
  • @wingmiester 我对最后一个 \d 进行了更改,以匹配最少 1 次和最多 4 次。因此允许 12 到 16 位数字。
  • 非常感谢,这一切都非常有用,问题现已解决。
  • 进一步测试表明,我的正则表达式仍然不适用于我正在测试的所有格式。在这个演示中是我感兴趣的每种格式的示例:Regex Demo。这可能是一个很大的问题,但如果有一种简单的方法可以匹配未满足的测试字符串,那就太好了!我使用的正则表达式是我原来的正则表达式,因为答案中提到的正则表达式排除了比它固定的更多的内容。感谢您的帮助和耐心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多