【问题标题】:Regex not catching continuous credit card number正则表达式没有捕捉到连续的信用卡号
【发布时间】:2020-04-23 07:19:08
【问题描述】:

当号码有<space>或有"-"时,我的正则表达式匹配,如果所有16位卡号都没有<space>"-",那么它不匹配。

(4\d{3}[\s\-\\]\d{4}[\s\-\\]\d{4}[\s\-\\]\d{4})

匹配4444-0000-0000 0000 但它不匹配`4444000000000000

【问题讨论】:

标签: regex python-3.x


【解决方案1】:

通过在字符类后面编码? 使分隔符可选:

\b(4\d{3}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4})\b

live demo

我在任一端添加了字边界 \b 以使其不匹配,例如 40001111222233338 的前 16 位。

顺便说一句,您可以通过重复[\s-]?\d{4} 3 次来更简洁地编写代码,如下所示:

\b(4\d{3}([\s-]?\d{4}){3})\b

【讨论】:

  • 鉴于\s 将匹配换行符或制表符,使用文字空间可能更合适。
  • @Nick 我完全同意并且也注意到了这一点,但我想做出最小的改变来解决问题。我会建议你,谢谢。
  • 我很好奇你为什么包含一个捕获组。
  • @CarySwoveland 我添加了一个组来重复它。我没有让它不被捕获,因为a)我不会打扰输入?:,b)正则表达式无论如何都很难阅读,所以不要添加你不需要的东西,以及c) “性能”差异很小,你很难衡量它。总而言之,除非有迫切的需要,例如我想保持编号为 1-n 的多个捕获组,否则我从不使用非捕获组。
  • 这很有趣(尤其是 a) :-))。另一种观点是,如果在使用非捕获组的情况下使用捕获组,则可能会导致读者相信您将使用捕获组的内容,并寻找不存在的内容。我怀疑这有什么不同(特别是如果你的同事知道你是拒绝使用非捕获组的人)。
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2016-03-12
  • 2023-03-17
  • 2019-02-26
相关资源
最近更新 更多