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

sam*_*ers 2 java regex

.*为什么在字符串上使用正则表达式时会得到两个匹配项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针对字符串的模式abcd 1234 abcd给出了两个匹配项。而且我不想知道这些信息。

我发现的问题是,当用 java -
Ref - 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());
  }
Run Code Online (Sandbox Code Playgroud)

输出是 -

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.
Run Code Online (Sandbox Code Playgroud)

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

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

ter*_*don 5

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

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

regex101 网页的屏幕截图,其中显示了相关选项