Regex 信用卡正则表达式

Regex 信用卡正则表达式,regex,Regex,我试图理解这个为visa卡编写的正则表达式,但我在理解分组和非捕获组时遇到了问题 所有Visa卡号码都以4开头。新卡有16位数字。旧卡有13张 我明白这部分: ^4[0-9]{12} 和结尾的问号(因为最后3位是可选的) 但是我不明白为什么我们需要把最后一部分分组,如果我们这样做了,为什么我们需要包括 ?: 我的意思是,如果还有3个数字需要捕获,那么我们为什么要使用非捕获组呢 为什么我们需要将最后一部分分组 这样我们就可以将最后三个字符作为可选字符,否则最后一个字符就可以作为可选字符(\d\

我试图理解这个为visa卡编写的正则表达式,但我在理解分组和非捕获组时遇到了问题

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

我明白这部分:

^4[0-9]{12}
和结尾的问号(因为最后3位是可选的) 但是我不明白为什么我们需要把最后一部分分组,如果我们这样做了,为什么我们需要包括

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

为什么我们需要将最后一部分分组

这样我们就可以将最后三个字符作为可选字符,否则最后一个字符就可以作为可选字符<代码>(\d\d)?不等于
\d\d?

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

为什么我们需要将最后一部分分组

这样我们就可以将最后三个字符作为可选字符,否则最后一个字符就可以作为可选字符<代码>(\d\d)?不等于
\d\d?

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

最后一部分,
(?:[0-9]{3})?
(?:)一起分组
以便最终的
将适用于整个组。如果省略分组,正则表达式将变成
[0-9]{3}?
,这实际上意味着完全不同的内容
{x,y}?
表示在x到y的任意位置匹配上一个表达式,但更愿意匹配尽可能少的次数(即,它是非贪婪的)<代码>{x}?没有任何意义,因为它意味着精确匹配x次,希望尽可能少地使用与
{x}
相同的代码

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

最后一部分,
(?:[0-9]{3})?
(?:)分组
以便最终的
将适用于整个组。如果省略分组,正则表达式将变成
[0-9]{3}?
,这实际上意味着完全不同的内容
{x,y}?
表示在x到y的任意位置匹配上一个表达式,但更愿意匹配尽可能少的次数(即,它是非贪婪的)<代码>{x}?没有任何意义,因为它意味着精确匹配x次,希望尽可能少地使用与
{x}
相同的代码


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

ty我得到了它的分组部分,但我仍然不明白为什么我们需要使用非捕获组。我正在测试13-16信用卡和'4[0-9]{12}(?[0-9]{3}?)和'4[0-9]{12}([0-9]{3}?)上的正则表达式。在这里,与捕获组相比,非捕获组提高了性能(它将字符存储在临时缓冲区中)。我得到了它的分组部分,但我仍然不明白为什么我们需要使用非捕获组。我正在测试13-16信用卡和'4[0-9]{12}(?[0-9]{3}?)和'4[0-9]{12}([0-9]{3}?)上的正则表达式。在这里,与捕获组相比,非捕获组提高了性能(将字符存储在临时缓冲区中)。这是完美的答案!这是完美的答案!
?: