0

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

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

如果信用卡号出现在从任何位置开始的 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)。

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

4

1 回答 1

1

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

/\b(4\d{3}(?:[\s._-]*\d{4}){3})\b/

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

于 2013-09-07T00:49:11.393 回答