Java (1.6.20) で一致する先頭/末尾の $ を持つ正規表現を取得するのに問題があります。
このコードから:
System.out.println( "$40".matches("\\b\\Q$40\\E\\b") );
System.out.println( "$40".matches(".*\\Q$40\\E.*") );
System.out.println( "$40".matches("\\Q$40\\E") );
System.out.println( " ------ " );
System.out.println( "40$".matches("\\b\\Q40$\\E\\b") );
System.out.println( "40$".matches(".*\\Q40$\\E.*") );
System.out.println( "40$".matches("\\Q40$\\E") );
System.out.println( " ------ " );
System.out.println( "4$0".matches("\\b\\Q4$0\\E\\b") );
System.out.println( "40".matches("\\b\\Q40\\E\\b") );
次の結果が得られます。
false
true
true
------
false
true
true
------
true
true
最初の 2 つのブロックの先頭の false が問題のようです。つまり、先頭/末尾の $ (ドル記号) は、\b (単語境界) マーカーのコンテキストで適切に取得されません。
\b を .* に置き換えるか、すべて一緒に削除すると、目的の結果が得られるため、ブロック内の真の結果は、引用符で囲まれたドル記号自体ではないことを示しています。
最後の 2 つの「真」の結果は、問題が内部的に引用された $ にも、引用された式「\Q ... \E」内の単語境界 (\b) の一致にもないことを示しています。
これは Java のバグですか、それとも何か不足していますか?