Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么空正则表达式和空捕获组正则表达式返回字符串长度加1的结果_Java_Regex_String - Fatal编程技术网

Java 为什么空正则表达式和空捕获组正则表达式返回字符串长度加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 正则表达式引擎被硬编码为在零长度匹配时前进一个位置(否则无限循环)。您的正则表达式匹配一个零长度的子字符串。每个字符之间都有零长度的子字符串(想想“

您如何解释空正则表达式和空捕获组正则表达式返回字符串长度加1的结果

代码

输出

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 "
 ^ ^ ^ ^