「\」(バックスラッシュ)は、正規表現においてエスケープとして扱われますが、
Java の文字列においてもエスケープとして扱われます。
つまり、文字列中の "" をエスケープとして最初に解釈するのは
Javaコンパイラです。
"^\.+|^\@+" という記述は、まずJava コンパイラによって解釈され、
コンパイラの出力する 実行コードには、
"^.+|^@+"
という形で収納されます。
正規表現ライブラリは、このコンパイルされた文字御列を扱うのです。
以上は、コンピュータ側の処理順序ですが、
記述する人間の思考としてはこの逆をたどります。
まず、使いたい正規表現の文字列として、
"^.+|^@+"
を考えます、この段階では、あなたのおっしゃるように、
エスケープ文字の定義方法から考えると、\一文字で表現すべき
という考えで正規表現文字列を考えます。
その後、Java コンパイラでエスケープ処理が行われることを考慮して、
「これは Java文字列のエスケープではなくて "" 自体なんだよ」
とコンパイラに教える意味で、"" を "\" に書き換えて、ソースコード上の文字列の記述を完成させます。
このように、問題がややこしくなるのは、Java のソースコード上の正規表現文字列というものが、
Javaコンパイラと正規ライブラリという、
二つの異なるルールで解釈を行うプログラムを経由して解釈される
ことに起因しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/27 17:04