【问题标题】:Credit Card regex信用卡正则表达式
【发布时间】:2023-03-17 07:40:01
【问题描述】:

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

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

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

我理解这部分:

^4[0-9]{12}

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

?:

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

【问题讨论】:

    标签: regex


    【解决方案1】:

    最后一部分(?:[0-9]{3})?(?: ) 组合在一起,因此最后的? 将应用于整个组。如果分组被忽略,正则表达式变为[0-9]{3}?,这实际上意味着完全不同的东西。 {x,y}? 表示匹配前一个表达式从 xy 次,但希望匹配尽可能少(即它是非贪婪的)。 {x}? 使用起来没有任何意义,因为它意味着精确匹配 x 次,希望尽可能少——它与 {x} 相同。

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

    【讨论】:

    • 这是完美的答案!
    【解决方案2】:

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

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

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

    【讨论】:

    • ty 我得到了它的分组部分,但我仍然不明白为什么我们需要使用非捕获组即时测试 13-16 信用卡和 '4[0-9] 上的正则表达式{12}(?:[0-9]{3})?和 '4[0-9]{12}([0-9]{3})?'工作
    • 这里,与捕获组(将字符存储在临时缓冲区中)相比,非捕获组提高了性能。
    猜你喜欢
    • 2015-09-14
    • 2018-08-15
    • 1970-01-01
    • 2012-11-10
    • 2016-03-12
    • 2010-11-30
    • 2012-03-08
    • 2016-07-31
    • 2019-02-26
    相关资源
    最近更新 更多