我试图理解这张为签证卡写的正则表达式,但我对理解分组和非捕获组有疑问。
所有Visa卡号码均以4开头。新卡有16位数字。旧卡有13个。
^4[0-9]{12}(?:[0-9]{3})?$
我理解这一部分:
^4[0-9]{12}
和最后的问号(因为最后3位是可选的) 但我不明白为什么我们需要分组最后一部分,如果我们这样做,为什么我们需要包括
?:
我的意思是如果还有3个数字我们需要捕获它们,那么我们为什么要使用非捕获组呢?
答案 0 :(得分:3)
最后一部分(?:[0-9]{3})?
与(?: )
分组,以便最终?
适用于整个群组。如果省略分组,则正则表达式变为[0-9]{3}?
,这实际上意味着完全不同的东西。 {x,y}?
表示将前一个表达式与 x 到 y 的任何时间匹配,但更喜欢匹配尽可能少的次数(即非贪婪)。 {x}?
使用没有任何意义,因为它意味着完全匹配 x 次,更喜欢尽可能少 - 它与{x}
相同。
使用非捕获分组(?: )
的原因是因为我们不需要捕获最后三位数字。匹配模式之间存在差异,这是您在验证信用卡号时正在执行的操作,以及使用括号捕获其中的一部分。匹配只是告诉你输入是否与正则表达式匹配,这就是我们在这里所关心的。捕获允许您获取输入字符串的一部分的值。你可以在这里使用常规的捕获括号,但它仍然会匹配相同,但它会不必要地捕获最后三位数,可能(稍微)慢一点并使用(稍微)更多的内存。
答案 1 :(得分:2)
为什么我们需要对最后一部分进行分组?
因此,我们可以将最后三个作为可选项,否则单独的最后一个字符将成为可选项。 (\d\d)?
不等于\d\d?
。
(?:...)
被称为非捕获组通常用于对字符或模式进行分组,您也可以使用捕获组(...)
,仅当您想要捕获16位数卡中的最后三位数时。