1

我对start()and的定义中关于 Matcher 的 Java 文档有点困惑end()

Matcher.start()

Matcher.end()

考虑以下代码:

public static void test()
{
    String candidate = "stackoverflow";
    Pattern p = Pattern.compile("s");
    Matcher m = p.matcher(candidate);
    
    m.find();
    int index = m.start();
    out.println("Index from Match\t"+index);
    
    int offset = m.end();
    out.println("Offset from match\t"+offset);
}

以上将返回以下结果。

匹配 0 的索引

与第 1 场比赛的偏移量

据我所知,每个 char 数组或字符串都将从索引 0 开始,并且在上面的表达式中是正确的。但是 Offset 也返回相同的字符 's' 但为什么它以 1 开头?

4

1 回答 1

3

不,它不是以 1 开头 - 它以 0 开头。文档说明得很清楚:

返回匹配的最后一个字符之后的偏移量。

(强调我的。)

基本上它是排他形式的比赛结束,这在Java中很常见。这意味着您可以执行以下操作:

String text = candidate.substring(matcher.start(), matcher.end());

请注意,您的“索引”和“偏移量”实际上应该被视为“开始”和“结束”(因此是方法名称)。在这种情况下,术语“索引”和“偏移量”实际上是同义词;重要的一点是start()返回匹配开始的索引/偏移量,并end()返回匹配结束后的索引/偏移量。

于 2012-05-06T15:59:01.250 回答