从这个tutorial我学到了“正则表达式 - 量词”,并基于本教程中使用的test code。
Enter your regex: a??
Enter input string to search: a
I found the text "" starting at index 0 and ending at index 0.
I found the text "" starting at index 1 and ending at index 1.
和
Enter your regex: a??
Enter input string to search: aaa
I found the text "" starting at index 0 and ending at index 0.
I found the text "" starting at index 1 and ending at index 1.
I found the text "" starting at index 2 and ending at index 2.
I found the text "" starting at index 3 and ending at index 3.
另外
Enter your regex: a??
Enter input string to search: cab
I found the text "" starting at index 0 and ending at index 0.
I found the text "" starting at index 1 and ending at index 1.
I found the text "" starting at index 2 and ending at index 2.
I found the text "" starting at index 3 and ending at index 3.
为什么吗
答案 0 :(得分:4)
??
是量词,因此它表示量化术语应匹配多少次,0或1次,优选0 。 ??
本身不会匹配任何东西,它只是装饰另一个表达式,说明在测试的字符串中该表达式要匹配多少次。
Iff 表达式的其余部分与lazy 0 times
部分匹配不匹配,它会再次尝试使用1 time
部分匹配。
如果整个正则表达式只包含某个术语的延迟可选匹配,那么总是匹配测试字符串中的空位置。所以这种量词只有在有其他术语时才有用。例如,表达式ba??d
将首先尝试匹配bd
,然后匹配bad
。
仍然,为什么正则表达式匹配字符串中的每个字符(最后加一个)?好吧,空匹配是一个有效的正则表达式。例如,搜索^
或$
(字符串的开头和结尾)将产生匹配,尽管是空的。对于这个“无用”表达式来说,测试字符串中的每个位置都是表达式的有效匹配,不会对匹配施加任何约束。
答案 1 :(得分:0)
这是因为您使用?
执行?
运算符LAZY,因此它会尽可能少地匹配。
你试图匹配a
0或1次,但你告诉正则表达式引擎匹配尽可能少,所以它将匹配0次并且它匹配字符串中的许多字符( +1)。