正则表达式匹配信用卡号,除非它们出现在 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 中的主要内容,如果未能解决你的问题,请参考以下文章