Java 为什么空正则表达式和空捕获组正则表达式返回字符串长度加1的结果
您如何解释空正则表达式和空捕获组正则表达式返回字符串长度加1的结果 代码 输出Java 为什么空正则表达式和空捕获组正则表达式返回字符串长度加1的结果,java,regex,string,Java,Regex,String,您如何解释空正则表达式和空捕获组正则表达式返回字符串长度加1的结果 代码 输出 Pattern - empty string []: 0 / 0 []: 1 / 1 []: 2 / 2 []: 3 / 3 Pattern - empty capturing group []: 0 / 0 []: 1 / 1 []: 2 / 2 []: 3 / 3 正则表达式引擎被硬编码为在零长度匹配时前进一个位置(否则无限循环)。您的正则表达式匹配一个零长度的子字符串。每个字符之间都有零长度的子字符串(想想“
Pattern - empty string
[]: 0 / 0
[]: 1 / 1
[]: 2 / 2
[]: 3 / 3
Pattern - empty capturing group
[]: 0 / 0
[]: 1 / 1
[]: 2 / 2
[]: 3 / 3
正则表达式引擎被硬编码为在零长度匹配时前进一个位置(否则无限循环)。您的正则表达式匹配一个零长度的子字符串。每个字符之间都有零长度的子字符串(想想“每个字符之间的间隙”);此外,正则表达式引擎还考虑字符串的开始和结束的有效匹配位置。因为长度字符串<代码> N< /代码>包含<代码> N+ 1 字母之间的空隙(计数开始和结束,ReGEX引擎执行),您将得到<代码> N+1 匹配。< P> ReEX引擎也考虑字符前后字符。您可以从以下事实中看出这一点:它们有
^
(字符串的开头)、$
(字符串的结尾)和\b
单词边界,它们在某些位置匹配,而不匹配任何字符(因此在字符之间/之前/之后)。因此,我们必须考虑字符之间的N-1位置,以及第一个和最后一个位置(因为^
和$
将分别匹配),这将为您提供N+1个候选位置。所有这些都与完全不受限制的空模式相匹配
以下是您的匹配项:
" a b c "
^ ^ ^ ^
对于N个字符,这显然是N+1
对于其他允许零长度匹配的模式,您将获得相同的行为,但实际上在您的模式中找不到更长的匹配。例如,尝试
\d*
。它无法在您的输入字符串中找到任何数字,但*
将很乐意返回零长度匹配。您可以尝试打印每个捕获组的开始和结束偏移量吗?谢谢,答案由提供的开始和结束来证实。字符之间只有两个位置。@Vitaly抱歉,这在当时是不准确的。但是第一个字符之前和最后一个字符之后的位置显然也会被考虑,因为在这些位置中有匹配的锚定^
和$
。
" a b c "
^ ^ ^ ^