使用尾随数字的正则表达式信用卡匹配
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(?<!\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(?<!\d.)
正在检查其后是否有数字和非单词字符,也许您想要\b(?<!\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
【讨论】:
以上是关于使用尾随数字的正则表达式信用卡匹配的主要内容,如果未能解决你的问题,请参考以下文章