正则表达式:为什么?模式匹配包含“a”本身的任何字符串中的空字符串“”?

时间:2013-01-08 07:58:28

标签: regex

从这个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.

为什么吗

2 个答案:

答案 0 :(得分:4)

??是量词,因此它表示量化术语应匹配多少次,0或1次,优选0 ??本身不会匹配任何东西,它只是装饰另一个表达式,说明在测试的字符串中该表达式要匹配多少次。

Iff 表达式的其余部分与lazy 0 times部分匹配不匹配,它会再次尝试使用1 time部分匹配。

如果整个正则表达式只包含某个术语的延迟可选匹配,那么总是匹配测试字符串中的空位置。所以这种量词只有在有其他术语时才有用。例如,表达式ba??d将首先尝试匹配bd,然后匹配bad

仍然,为什么正则表达式匹配字符串中的每个字符(最后加一个)?好吧,空匹配是一个有效的正则表达式。例如,搜索^$(字符串的开头和结尾)将产生匹配,尽管是空的。对于这个“无用”表达式来说,测试字符串中的每个位置都是表达式的有效匹配,不会对匹配施加任何约束。

答案 1 :(得分:0)

这是因为您使用?执行?运算符LAZY,因此它会尽可能少地匹配。

你试图匹配a 0或1次,但你告诉正则表达式引擎匹配尽可能少,所以它将匹配0次并且它匹配字符串中的许多字符( +1)。