gpt4 book ai didi

java - 为什么这个正则表达式 ".*"与 "abcd 1234 abcd"匹配会给出两个匹配项?

转载 作者:行者123 更新时间:2023-12-02 01:48:28 25 4
gpt4 key购买 nike

为什么在字符串 abcd 1234 abcd 上使用正则表达式 .* 时会得到两个匹配项?请参阅https://regex101.com/r/rV8jfz/1 .

从regex101给出的解释中,我可以看到第二个匹配发生在位置14-14,并且匹配的值为null。但为什么还要进行第二场比赛呢?有什么办法可以避免第二场比赛吗?

我理解 .* 表示零个或多个任何字符,因此它试图找到零次出现。但我不明白为什么需要这个空匹配。
问题是在任何语言(例如 Java)中使用时,当我执行 while(matcher.find()) { ... } 时,这会循环两次,而我希望它只循环一次.

我知道这不可能是现实世界的匹配情况,但为了理解和探索正则表达式,我认为这是一个很好的研究案例。

编辑 - 遵循 @terdon 回复。我确实喜欢在 regex101 中保留/g 选项,我知道这一点。我想知道可能的匹配总数。
https://regex101.com/r/EvOoAr/1 -> 针对字符串 abcd 1234 abcd 的模式 abcd 给出两个匹配项。我不想知道这些信息。

我发现的问题是,当用 java 这样的语言处理这个问题时 -
引用-https://onecompiler.com/java/3xnax494k

  String str = "abcd 1234 abcd";
Pattern p = Pattern.compile(".*");
Matcher matcher = p.matcher(str);
int matchCount=0;
while(matcher.find()) {
matchCount++;
System.out.println("match number: " + matchCount);
System.out.println("matcher.groupCount(): " + matcher.groupCount());
System.out.println("matcher.group(): " + matcher.group());
}

输出是-

match number: 1
matcher.groupCount(): 0 //you can ignore this
matcher.group(): abcd 1234 abcd
match number: 2
matcher.groupCount(): 0
matcher.group(): //this is my concern. The program has to deal with this nothing match some how.

如果 find() 与“无”不匹配,那么作为一名程序员,这对我来说会很好。我应该在循环中添加额外的代码来捕获这种“无”情况。

这个空问题(在代码中)在这个正则表达式情况下会变得更糟 - https://regex101.com/r/5HuJ0R/1 -> [0-9]*abcd 1234 abcd 匹配得到 12 个匹配项。

最佳答案

您获得两个匹配项的原因是您正在使用 g (全局)运算符。如果您从 regex101 示例中删除它,您将只会获得一个匹配项。

发生这种情况是因为全局运算符使正则表达式引擎尝试在字符串上查找尽可能多的匹配项。由于表达式 .* 匹配所有内容,因此它也不匹配任何内容,即空字符串。因此,第一个匹配是整个字符串,然后第二个匹配是匹配后面的“无”,它匹配一个空字符串。删除 g 会使其在第一个匹配项(整个字符串)处停止,而不尝试查找其他匹配项:

screenshot of the regex101 webpage with the relevant options indicated

关于java - 为什么这个正则表达式 ".*"与 "abcd 1234 abcd"匹配会给出两个匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70624100/

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