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の内部状態が変更されると一致した場所とずれてしまうのです。