【问题标题】:RegEx to find credit card numbers with embedded spacesRegEx 查找带有嵌入空格的信用卡号
【发布时间】:2013-05-10 06:45:33
【问题描述】:

我们目前有内容合规性,通过我们监控任何包含信用卡号且没有空格的内容(例如 5100080000000000

我们需要一个 reg ex 来提取每 4 位用空格输入的信用卡号(例如:5100 0800 0000 0000

我们一直在寻找替代的 reg exs,但还没有找到适用于上述两种情况的。

我们当前使用的正则表达式如下

^((4\d{3})|(5[1-5]\d{2})|(6011)|(34\d{1})|(37\d{1})) -?\d{4}-?\d{4}-?\d{4}|3[4,7][\d\s-]{15}$

【问题讨论】:

  • 你为什么不先删除所有的空格?
  • 我喜欢使用 www.regexper.com 来可视化这些场景。你试过了吗?
  • @ExplosionPills。您使用正则表达式在文档中查找字符串。您无法删除文档中的所有 个空格,否则可能会使许多其他数据无效。理想情况下,您可以从文档中的信用卡中删除空格,但您需要正则表达式来查找信用卡,所以...

标签: regex credit-card


【解决方案1】:

一旦有人使用美国运通卡并在任何一个“块”中输入 3 或 5 个数字而不是 4

【讨论】:

    【解决方案2】:

    您似乎已经接受了每四个字符的破折号。因此,您可以在任何地方简单地将-? 替换为[- ]?

    如果您要求破折号或空格保持一致 - 也就是说,根本不允许分组,或者每四个字符一个破折号,或者每四个字符一个空格,您可以使用反向引用来强制重复相同到第一场比赛:

    ^(?:4\d{3}|5[1-5]\d{2}|6011|3[47]\d{2})([- ]?)\d{4}\1\d{4}\1\d{4}$
    

    你会注意到我删除了最后的3[4,7]...,这看起来像是一个错误的添加,显然是在尝试部分解决这个问题时做出的。此外,我将括号更改为非分组的 (?:...) 或在没有分组似乎必要或有用的地方简单地删除它们,主要是因为这样可以更容易地查看反向引用 \1 所指的内容。最后,34.. 和 37.. 模式有 \d{1} 显然是 \d{2} 的意图(或者如果这些特定系列在第一个破折号之前只有三位数字,那么重复 {1} 只是多余的,但是 @ 987654330@ 部分会更错误!)

    【讨论】:

      【解决方案3】:

      只需在您已经拥有可选-? 的地方添加可选的/s?

      所以你的正则表达式变成了

      ^((4\d{3})|(5[1-5]\d{2})|(6011)|(34\d{1})|(37\d{1}))-?\s?\d{4}-?\s?\d{4}-?\s?\d{4}|3[4,7][\d\s-]{15}$
      

      【讨论】:

        【解决方案4】:

        试试这个:

        (\d{4} *\d{4} *\d{4} *\d{4})
        

        【讨论】:

          【解决方案5】:
          ((\d+) *(\d+) *(\d+) *(\d+))
          

          这将是一般的想法(它甚至可以工作!),如果你愿意,你可以完善它。有一个很棒的页面可以实时测试您的正则表达式 - http://rubular.com/

          【讨论】:

            猜你喜欢
            • 2023-03-17
            • 2018-07-13
            • 2014-08-05
            • 1970-01-01
            • 2020-09-15
            • 2012-06-27
            • 1970-01-01
            • 2012-04-09
            • 2020-10-18
            相关资源
            最近更新 更多