正则表达式信用卡匹配使用追踪编号

时间:2015-09-01 19:03:00

标签: regex credit-card

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

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

我已经根据我们的需求改进了这一吨,我在几个月内逐渐完成了这项工作。你可以忽略很多复杂性(它只是为信用卡做精确的数字匹配)。我只想尝试处理额外的尾随数字。我目前正在使用的正则表达式是:

\b(?<!\d.)(3[47]\d{2}([ -]?)(?!(\d)\3{5}|123456|234567|345678|5454545)\d{6}\2(?!(\d)\4{4})\d{5}|((4\d|5[1-5]|65)\d{2}|6011)([ -]?)(?!(\d)\8{3}|1234|3456|5678)\d{4}\7(?!(\d)\9{3})\d{4}\7\d{4})(\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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

我需要的字符串是:

(?!.\d\d)

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

\b(?<!\d.)(3[47]\d{2}([ -]?)(?!(\d)\3{5}|123456|234567|345678|424242|545454|11111)\d{6}\2(?!(\d)\4{4})\d{5}|((4\d|5[1-5]|65)\d{2}|6011)([ -]?)(?!(\d)\8{3}|4242|5454|1234|3456|5678|2345|4567|1111)\d{4}\7(?!(\d)\9{3})\d{4}\7\d{4})(\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