为什么在 `(.+?)` 后加一个 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
中找到 w
。 w
匹配,所以满足一个或多个的要求。由于匹配已经有效,因此它被 returned。你得到 John w
.
现在,您在 (.+?)
之后添加一个 space。 John
像以前一样匹配并捕获到组 1 中,space 与模式中的 space 匹配(同样,和以前一样),然后执行 .+?
-在 writes
之前找到一个空位置。它匹配此位置并继续匹配 space。该位置没有 space,因为有 w
。正则表达式引擎返回 .+?
并消耗 w
。检查 r
是否是 space - 不,不是。引擎以这种方式检查字符串,直到第一个匹配 space,并在 writes
之后找到它。因此,(John) (.+?)
的有效匹配是 John writes
.
我试图在一个较大的字符串中找到一个较小的字符串 String patternString1 = "(John) (.+?)";
。较小的字符串由两组组成,即 (John) (.+?)
。但是,我只是在 (.+?)
.
对于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
中找到 w
。 w
匹配,所以满足一个或多个的要求。由于匹配已经有效,因此它被 returned。你得到 John w
.
现在,您在 (.+?)
之后添加一个 space。 John
像以前一样匹配并捕获到组 1 中,space 与模式中的 space 匹配(同样,和以前一样),然后执行 .+?
-在 writes
之前找到一个空位置。它匹配此位置并继续匹配 space。该位置没有 space,因为有 w
。正则表达式引擎返回 .+?
并消耗 w
。检查 r
是否是 space - 不,不是。引擎以这种方式检查字符串,直到第一个匹配 space,并在 writes
之后找到它。因此,(John) (.+?)
的有效匹配是 John writes
.