argius note

プログラミング関連

Matcherのinputがimmutableでない場合の注意点

正規表現で、Pattern.matcher(CharSequence)のパラメータにStringを指定する場合は気にしなくて良いんですが、これがStringBufferなどのmutableな実装クラスの場合は注意が必要です。
次のようなパターンマッチを行った後で、Matcher.find()の後で入力の文字シーケンスに変更があった場合、期待した結果が得られません。

StringBuffer buffer = new StringBuffer("ABC123DEF");
Matcher matcher = Pattern.compile("[0-9]+").matcher(buffer);
if (matcher.find()) {
    buffer.insert(0, ">>>");
    System.out.println(matcher.group()); // ABC
}

Matcherクラスの実装を見れば簡単に分かりますが、Matcherは一致した結果をCharSequenceに対する位置情報(int値)で保持しているので、CharSequenceの内部状態が変更されると一致した場所とずれてしまうのです。