为什么在 `(.+?)` 后加一个 space 可以完全改变结果

why adding a space after `(.+?)` can completely change the result

我试图在一个较大的字符串中找到一个较小的字符串 String patternString1 = "(John) (.+?)";。较小的字符串由两组组成,即 (John) (.+?)。但是,我只是在 (.+?).

之后添加 space 就得到了完全不同的结果

对于String patternString1 = "(John) (.+?)";,(即没有space),结果是

found: John w
found: John D
found: John W

对于String patternString1 = "(John) (.+?) ";,(即用space),结果是

found: John writes
found: John Doe
found: John Wayne

为什么 space 会对结果产生如此大的影响?

String text
        = "John writes about this, and John Doe writes about that,"
        + " and John Wayne writes about everything.";

String patternString1 = "(John) (.+?)";
Pattern pattern = Pattern.compile(patternString1);
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
    System.out.println("found: " + matcher.group(1) + " " + matcher.group(2));
}

好吧,如果您包括结尾的 space,您也是在要求模式匹配那个 space。

John w 不再匹配,因为它不以 space.

结尾

它必须扩展为 John writes(注意匹配包括末尾的 space)。

量词.+?勉强(或"lazy")。这意味着它将匹配它量化的子模式 一次或多次, 需要的次数 return 有效匹配

您有 (John) (.+?) 个模式,您尝试在 John writes about this 中找到匹配项。正则表达式引擎找到 John,将其放入第 1 组内存缓冲区,找到一个 space,匹配它,然后在 writes 中找到 ww匹配,所以满足一个或多个的要求。由于匹配已经有效,因此它被 returned。你得到 John w.

现在,您在 (.+?) 之后添加一个 space。 John 像以前一样匹配并捕获到组 1 中,space 与模式中的 space 匹配(同样,和以前一样),然后执行 .+? -在 writes 之前找到一个空位置。它匹配此位置并继续匹配 space。该位置没有 space,因为有 w。正则表达式引擎返回 .+? 并消耗 w。检查 r 是否是 space - 不,不是。引擎以这种方式检查字符串,直到第一个匹配 space,并在 writes 之后找到它。因此,(John) (.+?) 的有效匹配是 John writes .