正则表达式匹配信用卡号,除非它们出现在 UUID 中

Posted

技术标签:

【中文标题】正则表达式匹配信用卡号,除非它们出现在 UUID 中【英文标题】:Regex to match credit card numbers unless they appear within a UUID 【发布时间】:2013-09-11 03:19:36 【问题描述】:

更笼统地表达这个问题:我如何编写一个匹配模式的正则表达式,除非它出现在另一个模式中的某个地方?

我有一个正则表达式(见下文),它匹配特定的信用卡号码,在数字组之间有或没有破折号/空格。

如果信用卡号出现在 UUID 字符串中(格式为“XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX”,其中 X 是任何十六进制数字),我想防止匹配从任意位置开始。

只有当 CC num 从 UUID 中的位置 1 开始时,负前瞻才有效,常规捕获组也是如此,所以我希望其他人有替代策略。

Visa 卡号的示例正则表达式组:

(4\d3(?:[\s_\-\n\r\.]*\d4)3)

应该匹配的示例字符串:

uuid1="836ac40c-e6ed-4026-2222-44443333f465" uuid2="46120710-5880-4000-8060-f0fadf056136"

应该匹配的示例字符串:

4026-2222-44443333
46120710-5880-4000
4111222233334444
4999-8888-7777-6666

由于处理信用卡号码的 PCI 合规性规则,我们试图严格检测任何字符串中的数字,除非该字符串被确定为安全(例如 UUID)。

使用的正则表达式引擎支持环视和反向引用,但不支持条件。

【问题讨论】:

您使用的语言或工具?你请一些应该匹配的输入和一些不应该匹配的输入? 【参考方案1】:

只需使用锚点或单词边界:

/\b(4\d3(?:[\s._-]*\d4)3)\b/

另请注意,我将[\s_\-\n\r\.] 简化为[\s._-]

【讨论】:

感谢您的想法。理想情况下,我们会尝试比这更严格。客户尝试各种有趣的事情将 CC 信息偷偷带入未经授权的地方。 也许吧,但你最初的想法实际上没有那么严格。这种解决方案更可取。

以上是关于正则表达式匹配信用卡号,除非它们出现在 UUID 中的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式信用卡号码测试

正则表达式识别商店信用卡号

正则表达式在文件中查找信用卡号不起作用

仅匹配出现的唯一字符串

使用正则表达式前瞻将信用卡号拆分为 4 块?

CakePHP 使用正则表达式验证蒙面信用卡