Reg Ex获得的数字比预期更多

时间:2017-12-30 12:15:23

标签: regex regex-negation regex-group

别建议我链接,我看了几百万次。
我查看了许多建议 - 例如Regex credit card number tests。但是,我并不主要关注验证潜在的信用额度。

我希望通过识别12到19个数字的序列(加上它们之间的几个常见分隔符)来在文档中找到(可能的)信用卡号。 @TimBiegeleisen指出,例如Finding or Verifying Credit Card Numbers正在讨论这个问题。但建议的解决方案会导致一些漏报。 (参见下面的“问题......”部分。)

示例输入:

  

['232625427',     '请停止检查已发送6/10 reg邮件和reissu fedex的220 2000000。请   收取信用卡4610 0000 0000 0000 exp 05/99 ...谢谢,Sxxx']   ['232653042',     '市场:Exxxx或Bxxxx-请用月信用卡设置丈夫和妻子   付款。信用卡上的姓名为Hxxxx-Jxxxx Lxxxx(婚前姓名,保单上的姓名不同)主卡号5424 0000 0000 0000 Exp 11-30-00。非常感谢。' ]

RegEx101.com attempt的更多样本输入。

我的正则表达式是

[1-9](\d[ ]?[ ]*?[-]?[-]*?[:]*?[:]?){11,18}\b

我的RegEx问题

  1. 紧跟字符串后,12-19位数字不匹配。它失败了,例如4554-4545-4545-4545Visa
  2. 更长时间运行的数字序列在结尾而非开头匹配:对于999999999999994190000000000000我得到9994190000000000000而不是9999999999999941900
  3. 我正在RegEx101.com进行测试。

1 个答案:

答案 0 :(得分:1)

要解决标题中的问题" Reg Ex获得的数字比预期更多" (阅读"数字" as"字符"但是),尝试:

[1-9]([- :]*\d){11,18}\b

这样,您不再匹配示例输入中的尾随空白。请参阅RegEx101.com中的实际操作。

更接近你在"问题所指出的内容......"应该是:

[1-9]([- :]*\d){11,18}

从末尾删除单词边界后,紧跟在数字序列后面的字符串不再导致错误否定。而且比赛也不再偏向于潜在比赛的结束。但是,这会处理001 111111111111与您的方法不同: RegEx101.com

这可以通过

来解决
[1-9][0-9]([- :]*\d){10,17}

以允许来自" 5452 0000 0000 0000000":RegEx101.com的更多零来为代价。

仅针对您的示例输入检查所有建议。不同的输入可能需要进一步调整。

如果需要调整/进一步详细说明,请发表评论。