gpt4 book ai didi

java - 模式匹配中的勉强限定符

转载 作者:行者123 更新时间:2023-12-01 09:56:03 25 4
gpt4 key购买 nike

我有以下程序

public class PatternMatching {
public static void main(String[] args) {
String pattern ="a??";
Pattern pattern1 = Pattern.compile(pattern);
String findAgainst = "a";
Matcher matcher = pattern1.matcher(findAgainst);
int count=0;
while(matcher.find()){
count++;
System.out.println(matcher.group(0)+".start="+ matcher.start()+".end="+matcher.end());
}
System.out.println(count);
}
}

打印以下输出

.start=0.end=0
.start=1.end=1
2

而不是

.start=0.end=0
a.start=0.end=1
.start=1.end=1
3

当我使用模式“b??”运行程序时输出是

.start=0.end=0
.start=1.end=1
2

这是正确的。即使它是一个勉强的限定符,输出不正确的原因是什么?

最佳答案

据我所知,问题是Java正则表达式引擎在遇到零长度匹配时使用以下算法:它将匹配的索引与当前正则表达式索引进行比较,如果它们重合,则正则表达式索引递增。

因此,当您将 a 之前的空格与 a?? 匹配时,正则表达式引擎会发现零长度匹配,并递增之后出现的索引 a,因此,跳过正确的匹配。

如果您使用贪婪版本 - a? - 输出将会不同:

a.start=0.end=1
.start=1.end=1
2

发生这种情况是因为第一个 a 已被消耗,正则表达式引擎索引位于 a 之后,现在可以匹配字符串结尾。

关于java - 模式匹配中的勉强限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205816/

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