1

start()との定義で Matcher に関する Java doc と少し混乱しています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 に答える