正则表达式量词匹配较短的序列

时间:2019-06-13 15:23:38

标签: javascript regex

我正在测试一种简化的正则表达式,以识别可能的信用卡号,以便我们将其过滤掉。我正在寻找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位数字。

2 个答案:

答案 0 :(得分:4)

只需删除懒惰的量词:

\b(?:\d[ -]*){13,16}\b

Demo

答案 1 :(得分:0)

根据本文档https://www.regular-expressions.info/creditcard.html

  

\ b(?:\ d [-] *?){13,16} \ b

这是查找带有空格或破折号的卡号的唯一方法 您所需要做的就是删除懒惰的“ *”?量词

要这样

  

\ b(?:\ d [-] *){13,16} \ b