SunのJava1.4とJava5のMatcher#find
こんなコードを1.4.2_08と1.5.0_06で動かしてみた。
StringBuffer buf = new StringBuffer("hoge"); Matcher matcher = Pattern.compile("o").matcher(buf); buf.delete(0, buf.length()); matcher.find();
1.4では正常に終了するものの、5.0だとmatcher.find()で例外が投げられる。
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.StringBuffer.charAt(StringBuffer.java:163) at java.lang.Character.codePointAt(Character.java:2335) at java.util.regex.Pattern$Single.match(Pattern.java:3313) at java.util.regex.Pattern$Start.match(Pattern.java:3019) at java.util.regex.Matcher.search(Matcher.java:1092) at java.util.regex.Matcher.find(Matcher.java:528)
1.4では、次回のマッチを試みた場合マッチさせる対象が存在しなければMatcher#findはfalseを返すようだが、それに対して5.0の場合、マッチさせる対象が存在しているか否かに関わらず現在のマッチの直後から判定してるようで文字を取得できなくて例外がスローされる。まぁつまり1.4は「マッチするのなかったよ。マッチ対象ないけど」で、5.0は「マッチ対象がないからマッチさせれないよ!」って感じか。ソース読んでないけど。
javadocを見ても微妙。個人的には1.4の動きの方が良いかなとは思う。find()は次にマッチするのがあるかどうかを見てるわけで、マッチ対象が存在していなかったならマッチしなかった(find()がfalseを返す)、という扱いのほうがしっくりくるかなぁと。