2012-05-06 6 views
1

start()end()の定義でMatcherに関するJavaのドキュメントとちょっと混乱しています。インデックスとオフセットはJava Regexで異なる意味を持ちますか?

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); 
} 

を次の結果を返します。

私はすべてのchar配列や文字列はインデックス0で開始され、それが上記の式に右だ学んだように試合1

から一致オフセット0

からのインデックス。 しかし、オフセットは同じ文字の 'を返しますが、なぜ1で始まるのですか?

+0

"**最後の文字が一致した後のオフセット**を返します"? – erikxiv

+0

インデックス・オフセット・セマンティクスではありません。どちらもインデックスであり、開始位置の1つ、終了位置を過ぎた1つのインデックスです。 'String.substring'のように –

答えて

3

いいえ、それは1で始まらない - それは、0から始まるドキュメントは、それが合理的に明らかに:

は、最後の文字がマッチし後のオフセットを返します。

(強調鉱山。)

基本的には、Javaで一般的である排他形態で試合終了です。あなたの「インデックス」とは、実際に「開始」と「終了」(したがって、メソッド名)とみなされるべきである「オフセット」

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

注:それはあなたのような何かを行うことができますを意味します。この文脈では、用語「インデックス」および「オフセット」は事実上同義語である。重要な点は、start()が一致の開始のインデックス/オフセットを返し、end()が一致の末尾の後のインデックス/オフセットを返します。

関連する問題