gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:37:34 29 4
gpt4 key购买 nike

我的代码:

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说。但说到实际,我有点不清楚情况如上。

最佳答案

? 是一个贪心量词,因此它会先尝试匹配 1 次出现,然后再尝试 0 次出现。在你的字符串中,

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

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

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

关于java - Java 正则表达式中的零长度匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906471/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com