Java正则表达式中的零长度匹配

我的代码:

Pattern pattern = Pattern.compile("a?");

Matcher matcher = pattern.matcher("ababa");

while(matcher.find()){

System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());

}

输出:

0[a]1

1[]1

2[a]3

3[]3

4[a]5

5[]5

我知道的 :

  • “一个?” 代表零个或一次出现的字符“ a”。

Java API说:

  • matcher.start()返回上一个匹配项的起始索引。
  • matcher.end()返回匹配的最后一个字符后的偏移量。
  • matcher.group()返回与上一个匹配项匹配的输入子序列。对于具有输入序列s的匹配器m,表达式m.group()和s.substring(m.start(),m.end())是等效的。对于某些模式,例如a *,请匹配空字符串。当模式成功匹配输入中的空字符串时,此方法将返回空字符串。

我想知道的是:

  1. 在哪种情况下,正则表达式引擎遇到给定字符的零出现-这里是字符’a’。
  2. 在这种情况下,匹配器中的start(),end()和group()方法实际上返回的是什么值。我已经提到了Java API所说的内容。但对于上述实际情况,我一点也不不清楚。

回答:

?是一个贪婪的量词,因此将首先尝试尝试0 occurence之前的1 occurence匹配。在您的字符串中

  1. 它以第一个字符’a’开头,并尝试再次匹配1次出现。’a’字符匹配,因此它返回您看到的第一个结果
  2. 然后它向前移动并找到一个“ b”。’b’字符与您的正则表达式1次出现不匹配,因此引擎回溯并尝试匹配0次出现。结果是空字符串被匹配->您得到了第二个结果。
  3. 然后它就移到了b的前面,因为那里不可能再有任何匹配,它又从第二个’a’字符开始。
  4. 等等…你明白了…

比这要复杂一些,但这是主要思想。当1次出现次数不匹配时,它将尝试使用0次出现次数。

至于start,end和group的值,它们将是匹配开始,结束和匹配的组的位置,因此在字符串的第一个0匹配项中,您将得到1,1和空字符串。我不确定这是否真的能回答您的问题。

以上是 Java正则表达式中的零长度匹配 的全部内容, 来源链接: utcz.com/qa/412669.html

回到顶部