Pattern.matches(String) は頭から尻まで一致したときに true

Java正規表現ではまったのでメモ。
Ruby

/a/ =~ "back" #=> true

と同じことを Java でしたくて、

Pattern.matches( "a", "back" ); //=> false

これが true になぜならんと1日悩んでたんだけど、これは次のコードと同値だった。

Pattern.compile( "^a$" ).matcher( "back" ).matches();

じゃあ、Pattern.matches の Javadoc にはどう書いてあるかって言うと、

matches
public static boolean matches(String regex, CharSequence input)


指定された正規表現コンパイルして、指定された入力とその正規表現をマッチします。
このメソッドを次の形式で呼び出すと、上記の動作が行われます。

Pattern.matches(regex, input);

上記のメソッドは、次の表現と同様に動作します。

Pattern.compile(regex).matcher(input).matches()

パターンを繰り返し使用する場合は、そのパターンをコンパイルして再利用した方が、毎回このメソッドを呼び出すよりも効率的です。

パラメータ:
regex - コンパイルされる表現
input - マッチされる文字シーケンス
例外:
PatternSyntaxException - 表現の構文が無効である場合

ってわけなので、Matcher#matches() を見ると、

matches
public boolean matches()


領域全体をこのパターンとマッチします。
マッチが成功した場合は、startend、および group メソッドを使用して詳細情報を取得できます。
戻り値:
領域シーケンスの全体がこの正規表現エンジンのパターンとマッチした場合にのみ true

この、「領域シーケンスの全体」っていうのが、正規表現^$ を含むってことみたい。
分かりにくいね。
matches() じゃなかったら何を使うのかって言うと find() を使う。
ちなみに Matcher#find() は、

find
public boolean find()


入力シーケンスからこのパターンとマッチする次の部分シーケンスを検索します。
このメソッドは、正規検索エンジンの領域の先頭から開始されます。 ただし、前回の呼び出しが正常に終了してから正規表現エンジンがリセットされていない場合は、前回のマッチで一致しなかった最初の文字から開始されます。
マッチが成功した場合は、startend、および group メソッドを使用して詳細情報を取得できます。
戻り値:
入力シーケンスの部分シーケンスがこの正規表現エンジンのパターンとマッチした場合にのみ true

「部分シーケンスが…」ってあるので、こっちは部分マッチで true
つまり、最初に掲載した、

/a/ =~ "back" #=> true

と同じ動作をするコードは、

Pattern.compile( "a" ).matcher( "back" ).find()

でした。