小编ble*_*end的帖子

为什么在这种情况下 java.util.regex.Matcher start() 和 end() 返回额外的字符?

我正在动态生成一些正则表达式,并用应用程序中的另一个字符串事后替换匹配的结果。我正在获取匹配的开始和结束索引,然后逐个替换每个匹配的字符块,然后调整下一个匹配的偏移量。然而,在其他几个成功匹配/替换的案例中的一场比赛中,我注意到我的开始和结束索引包含一个额外的字符。

这是我用来生成正则表达式的代码:

Pattern.compile("[^a-zA-Z]+(?<match>" + Pattern.quote(search[i]) + ")[^a-zA-Z]+")
Run Code Online (Sandbox Code Playgroud)

在这种情况下添加额外的字符

search[i] = "on a daily basis"
Run Code Online (Sandbox Code Playgroud)

得到的正则表达式

[^a-zA-Z]+(?<match>\Qon a daily basis\E)[^a-zA-Z]+
Run Code Online (Sandbox Code Playgroud)

这是要匹配的相关文本

to on a daily basis.
Run Code Online (Sandbox Code Playgroud)

我想要的输出是

on a daily basis
Run Code Online (Sandbox Code Playgroud)

这是我从 matcher.group("match") 获得的输出,但是当我从同一匹配器上下文调试 start() 和 end() 结果时,我分别得到 356 和 375 (这是在全文的上下文中) ),但您可以看到这两个数字之间的差异是 19,而字符串“on a daily basic”只有 16 个字符。

我假设我需要考虑 Pattern.quote 中的 \Q 和 \E?那么第三个额外的附加角色是从哪里来的呢?为什么这种情况只发生在这种模式/目标字符串的情况下?

是否还有其他不相关的原因导致我忽略的差异?

java regex string

2
推荐指数
1
解决办法
1937
查看次数

标签 统计

java ×1

regex ×1

string ×1