有些人喜欢在写信用卡号时将-
或空格放在数字子组之间,因此上述RE无法捕获它们。
请你解析RE:
(?:\d[ -]*?){13,16}\b
并解释为什么它可以解决问题?
我知道*?
将匹配前一个元素零次或多次,但次数尽可能少。
答案 0 :(得分:1)
(?:一些正则表达式)表示非捕获组
\ d表示十进制已经过了,例如[0-9]
[]表示匹配此中的任何字符。
实际上[ - ]表示找空格或 -
*表示0或更多
{}是(xMin,xMax)重复的范围
{13,16} =>重复13次或更多但少于17次
\ b表示模式必须通过前置标记终止。
对于这个问题\ b请参考非捕获组
您可以在http://regexr.com/上尝试此正则表达式的行为。
一些有效的模式是:
0332 - 221 - 212 - 111
0-11 -0151- 0151 - 10
<00> 0000 - 0000 - 0000 - 0 <00> 0000 - 0000 - 0000 - 00 <00> 0000 - 0000 - 0000 - 000 <00> 0000 - 0000 - 0000 - 000000000 - 0000 - 0000
0000-0000-0000-0000
0-0-0-0-0-0-0-0-00-0-0-0
答案 1 :(得分:0)
首先,捕获组用于对RegEx的部分进行分组。通过将()
放在组中所需的数据周围来定义它们。通过在?:
内添加()
来定义非捕获组,如此(?:data)
其次, Lazy RegEx试图尽可能少地捕获,而不是尽可能多地捕获。查看this StackOverflow question
RegEx如何运作:
(?: # Non-Capturing Group
\d # Digit
[ -]*? # Space or - (Hyphen), 0 or more times (Lazy)
)
{13,16} # Repeats the Non-Capturing Group 13 to 16 times
\b # Word Boundary
非捕获组将匹配任何包含1位数字的字符串,以及任意数量的空格(空格)和 - (连字符)。因此,9
,-9-
,- 9 -
,9
和- - - 9 - - -
都是匹配。
然后该组可以重复13到16次,所以上面的例子可以重复13到16次,以匹配每个信用卡数字
所以这些都是完全有效的匹配:
9999 - 9999 - 9999 - 9
9999 - 9999 - 9999 - 99
9999 - 9999 - 9999 - 999
9999 - 9999 - 9999 - 9999
999 - 999 - 999 - 999 - 999
99-99-99-99-99-99-99
9-9-9-9-9-9-9-9-9-9-9-9-9
答案 2 :(得分:0)
\d
匹配一个数字(Does "\d" in regex mean a digit?)
\b
标记了单词/数字的结尾
[0-9]{13-16}
表示括号中重复的字符,为13,14,15或16次。背景是旧信用卡号码有13位数的新信用卡号码有16位数。
因此,\b\d{13,16}\b
会查找/匹配13到16位数的任何序列,这意味着它可用于查找信用卡号,而无需使用任何&#39;
?:
是另一个特殊情况,意味着“无需捕获群集”(use of colon symbol in regular expression)
(?:pattern)
用于匹配模式,但不捕获它,导致从结果字符串中删除被质疑的字符,即&#39; - &#39; (What is a non-capturing group? What does a question mark followed by a colon (?:) mean?)
*
表示在
?
表示之前元素中的字符可以显示,但不必
*?
(在上面的正则表达式中使用)是非贪婪/懒惰版本,即[^a]*?
表示&#34; 0个或更多字符的序列,不包含&#39; a&# 39;,在符合正则表达式的其余部分时尽可能短。&#34;
因此,正则表达式匹配任意长度为13到16的数字序列,其中包含任意数量的&#39; - &#39;和&#39; &#39; (空格)
请注意,非捕获组?:
匹配但不捕获结果中的子字符串:应用于字符串\b(a)(?:b)(c)\b
的正则表达式"abc"
匹配,但结果中非跳过捕获组(组是( )
中的所有内容):
match: "abc", match1: "a", match2: "c"
(&#34; b&#34;未出现在匹配列表中)
但是,可以通过调用group()
对象上的match
来检索完整匹配,请参阅下面的Alan Moore的评论。