gpt4 book ai didi

java - 正则表达式在第二场比赛中重用了第一场比赛中的单词边界 - 为什么?

转载 作者:行者123 更新时间:2023-11-30 02:47:39 26 4
gpt4 key购买 nike

给定字符串:

String str = "STACK 2013 OVERFLOW3";

和模式:

Pattern pattern = Pattern.compile("\\b\\w+\\s\\b");

输出为:

STACK 
2013
为什么?我读到,一旦在比赛中使用了一个角色,就不能在下一场比赛中再次使用。

但是这里我们有 "\\b\\w+\\s\\b" 的第一个匹配:

\b 用于边界(在单词 STACK 之前)

\w+ 用于 STACK 单词

\s 用于 STACK 后的空格

\b 用于边界(word 2013 之前)

正如预期的那样,结果是匹配“STACK”。

然后我们有“\b\w+\s\b”的第二个匹配:

\b 用于边界(单词 2013 之前)<--- 此处此边界第二次使用

\w+ 用于 2013 年单词

\s 用于 2013 年之后的空间

\b 用于边界(在单词 OVERFLOW3 之前)

为什么在这些匹配中单词“2013”​​之前的单词边界使用了两次?

要重现的完整代码:

public static void main(String[] args) {
String str = "STACK 2013 OVERFLOW3";
Pattern pattern = Pattern.compile("\\b\\w+\\s\\b");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
}

最佳答案

首先,this SO post中有一些关于单词边界的很好的例子和描述。 。单词边界匹配的确切位置已在this regex tutorial中概述。 .

但是,你的问题是为什么 \b在同一个位置匹配两次?

答案是,单词边界属于一组非消耗模式,这些模式不会将它们匹配的文本添加到输出中,并且不会使正则表达式索引前进到结尾模式匹配,他们只是断言他们的模式之前或之后是否有东西。换句话说,这些是零宽度断言(如 Sebastian Proske 已经提到的)。

非消耗模式是环视、 anchor 和单词边界。

那么,当您的正则表达式到达 STACK 末尾时会发生什么?尾随\b匹配 2013 之前的位置 ,但正则表达式索引仍然存在,在 2013 之前。返回第一个匹配项,下一个匹配项从 2013 之前的相同位置开始。第一/领先\b在模式中断言 2013 之前的位置为 true是单词边界(在非单词之后和单词字符之前)。

要点是\b是一个零宽度断言也可以通过在环视中使用它来说明:环视和环视的结果是相同的:\b =(?<=\b) =(?!\b) 。它们都给出相同的结果。

关于java - 正则表达式在第二场比赛中重用了第一场比赛中的单词边界 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690538/

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