更一般地表达这个问题:我如何编写一个匹配模式的正则表达式,除非它出现在另一个模式中的某个地方?
我有一个正则表达式(见下文),它匹配特定的信用卡号码,在数字组之间有或没有破折号/空格。
如果信用卡号出现在从任何位置开始的 UUID 字符串(格式为“XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX”,其中 X 是任何十六进制数字)中,我想阻止匹配。
仅当 CC num 从 UUID 中的位置 1 开始时,负前瞻才有效,常规捕获组也是如此,所以我希望其他人有替代策略。
Visa 卡号的示例正则表达式组:
(4\d{3}(?:[\s_\-\n\r\.]*\d{4}){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)。
使用的正则表达式引擎支持环视和反向引用,但不支持条件。