使用尾随数字的正则表达式信用卡匹配

Posted

技术标签:

【中文标题】使用尾随数字的正则表达式信用卡匹配【英文标题】:Regular Expression credit card match using Trailing Number 【发布时间】:2015-11-27 03:09:01 【问题描述】:

我正在尝试对信用卡进行正/负(仅)匹配。我需要确定是否有额外的尾随数字(仅)。

我可以有任意字符串,但只有在数字之后有超过 2 个连续数字(带有任何空格)时才会触发匹配。

我已经根据我们的需要对它进行了大量的改进,我在几个月的时间里逐渐做到了。您可以忽略大部分复杂性(它只是对信用卡进行精确的数字匹配)。我只是想处理额外的尾随数字。我目前使用的正则表达式在这里:

\b(?<!\d.)(3[47]\d2([ -]?)(?!(\d)\35|123456|234567|345678|5454545)\d6\2(?!(\d)\44)\d5|((4\d|5[1-5]|65)\d2|6011)([ -]?)(?!(\d)\83|1234|3456|5678)\d4\7(?!(\d)\93)\d4\7\d4)(\b|\s)

以下匹配已经成功匹配:

some 4270446050075048
4270-4460-5007-5048
this:4270 4460 5007 5048.
4270 4460 5007 5048 4/20
4270 4460 5007 5048 what
4270 4460 5007 5048

以下成功不匹配:

42704460500750a8
4270
4270 4460 5007 504
42811293test123

但是,这个让我着迷。有很多具有这种类型的长数字模式的文件不断被捕获。我想更新包含的正则表达式以消除有效匹配,当且仅当它后跟至少 3 个数字时,例如在以下示例中:

4270 4460 5007 5048 1234 5083 5095 5179 5157 5219 5187 5095  
4270 4460 5007 5048 123123115132124151231
4270 4460 5007 5048123
42704460500750481234

但以下应继续生成匹配项(由于到期日期表示法):

4270 4460 5007 5048 12

我已经尝试了以下作为否定前瞻,但我可能误解了我需要做什么:

 (?![\d][^\d][^\d])

这导致匹配项发生了一些奇怪的变化,我没有完全理解(仅匹配的字符串没有尾随空格,或者有一个尾随空格,但任意位数)。我是分段构建的,但我不确定多个后备函数如何相互作用,这可能是问题的一部分。

如果您有兴趣尝试一下,这里有一个预先构建的测试平台:

https://regex101.com/r/oE1rZ1/2

谢谢!

【问题讨论】:

我不关注。请更具体。你用的是什么模式。它匹配(或不匹配)什么?您希望它匹配什么? 如果你需要一个匹配失败基于它后面的东西,你需要使用负前瞻。见regular-expressions.info/lookaround.html 我更新了它以希望增加清晰度 @EricM:请查看\b(?&lt;!\d.)(3[47]\d2([ -]?)(?!(\d)\35|123456|234567|345678|5454545)\d6\2(?!(\d)\44)\d5|((4\d|5[1-5]|65)\d2|6011)([ -]?)(?!(\d)\83|1234|3456|5678)\d4\7(?!(\d)\93)\d4\7\d4,5)\b(?![ ]+\d4)。请注意,一开始,\b(?&lt;!\d.) 正在检查其后是否有数字和非单词字符,也许您想要\b(?&lt;!\d[ ]) 开头是一个向后看,以验证它之前是否有一个数字。不过,感谢您的反馈。我想出了答案并将其发布在下面。 【参考方案1】:

玩了 4 个小时后,意识到我错过了什么。

我需要的字符串是:

(?!.\d\d)

最终的信用卡匹配字符串(我见过的最好的)是这样的:

\b(?<!\d.)(3[47]\d2([ -]?)(?!(\d)\35|123456|234567|345678|424242|545454|11111)\d6\2(?!(\d)\44)\d5|((4\d|5[1-5]|65)\d2|6011)([ -]?)(?!(\d)\83|4242|5454|1234|3456|5678|2345|4567|1111)\d4\7(?!(\d)\93)\d4\7\d4)(\b|\s)(?!.\d\d)

为了排除大多数“测试”和“样本”数字,例如 4242 4242 4242 42424 和 5454 5454 5454 5454 或 1234 5678 9012 3456 或 4111 1111 1111 1111、4123,它会在误报方面犯一点错误4567 8901 1111等

谢谢你的灵感,伙计们。 :-)

此特定正则表达式的详细测试套件位于此链接:

https://regex101.com/r/rW1fF3/1

【讨论】:

以上是关于使用尾随数字的正则表达式信用卡匹配的主要内容,如果未能解决你的问题,请参考以下文章

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

正则表达式匹配标签内容,同时省略前导和尾随空格

正则表达式3

使用正则表达式验证信用卡号

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

如何使用正则表达式删除尾随空格?