我正在测试一个用于识别可能的信用卡号的简化正则表达式,以便我们可以将它们过滤掉。我正在寻找 13-16 位数字,可以选择在每个数字后使用任意数量的空格和“-”,并且整个序列被单词边界包围。似乎这个正则表达式应该可以解决问题(选项 1): \b(?:\d[ -]*?){13,16}\b但是当我测试这个(在我的代码(在 JavaScript 中)和在regex101.com 上)使用它的测试字符串时, 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6它只匹配1 2 3 4 5 6 7 8 9 0 1 2 3,即我的{13,16}量词中最短的数字。我正在阅读的所有内容都表明它应该与可能的最长序列相匹配,但显然不是。如果我将正则表达式更改为\b(?:\d[ -]*?){16}\b匹配所有 16 位数字(但当然不匹配 13-15 位数字)。我可以先使用最长序列的交替来解决这个问题,就像这样(选项 2):\b(?:\d[ -]*?){16}|(?:\d[ -]*?){15}|(?:\d[ -]*?){14}|(?:\d[ -]*?){13}\b或者,如果我在第一次匹配 {12,15} 后显式添加另一个组到最后,就像这样(选项 3):\b(?:\d[ -]*?){12,15}(?:\d[ -]*?)\b如果其中之一是唯一的方法,我可以接受它,但它们都比更紧凑的选项 1 丑陋,而且我还想了解为什么选项 1 不像我想的那样工作它会。就此而言,为什么选项 3 在它匹配的项目数量方面似乎表现不同?它匹配 15 位数字而不是 12 位数字。
添加回答
举报
0/150
提交
取消