信用卡正则表达

时间:2015-07-14 17:15:33

标签: regex

我试图理解这张为签证卡写的正则表达式,但我对理解分组和非捕获组有疑问。

  

所有Visa卡号码均以4开头。新卡有16位数字。旧卡有13个。

^4[0-9]{12}(?:[0-9]{3})?$

我理解这一部分:

^4[0-9]{12}

和最后的问号(因为最后3位是可选的) 但我不明白为什么我们需要分组最后一部分,如果我们这样做,为什么我们需要包括

?:

我的意思是如果还有3个数字我们需要捕获它们,那么我们为什么要使用非捕获组呢?

2 个答案:

答案 0 :(得分:3)

最后一部分(?:[0-9]{3})?(?: )分组,以便最终?适用于整个群组。如果省略分组,则正则表达式变为[0-9]{3}?,这实际上意味着完全不同的东西。 {x,y}?表示将前一个表达式与 x y 的任何时间匹配,但更喜欢匹配尽可能少的次数(即非贪婪)。 {x}?使用没有任何意义,因为它意味着完全匹配 x 次,更喜欢尽可能少 - 它与{x}相同。

使用非捕获分组(?: )的原因是因为我们不需要捕获最后三位数字。匹配模式之间存在差异,这是您在验证信用卡号时正在执行的操作,以及使用括号捕获其中的一部分。匹配只是告诉你输入是否与正则表达式匹配,这就是我们在这里所关心的。捕获允许您获取输入字符串的一部分的值。你可以在这里使用常规的捕获括号,但它仍然会匹配相同,但它会不必要地捕获最后三位数,可能(稍微)慢一点并使用(稍微)更多的内存。

答案 1 :(得分:2)

  

为什么我们需要对最后一部分进行分组?

因此,我们可以将最后三个作为可选项,否则单独的最后一个字符将成为可选项。 (\d\d)?不等于\d\d?

(?:...)被称为非捕获组通常用于对字符或模式进行分组,您也可以使用捕获组(...),仅当您想要捕获16位数卡中的最后三位数时。