私は最近、 String.replaceAll(regex,replacement) がエスケープ文字「\」(スラッシュ)に関して非常に奇妙な動作をすることに気付きました
たとえば、filepath -String text = "E:\\dummypath"
を含む文字列があり、これを に置き換えたいと"\\"
し"/"
ます。
text.replace("\\","/")
出力を与えますが、"E:/dummypath"
例外を発生さtext.replaceAll("\\","/")
せますjava.util.regex.PatternSyntaxException
。
で同じ機能を実装したい場合は、次のreplaceAll()
ように記述する必要があります。
text.replaceAll("\\\\","/")
注目すべき違いの 1 つは、引数が文字列であるのreplaceAll()
に対して、引数が正規表現であることです。replace()
ただしtext.replaceAll("\n","/")
、同等の文字シーケンスとまったく同じように機能しますtext.replace("\n","/")
さらに掘り下げる: 他の入力を試すと、さらに奇妙な動作が観察されることがあります。
割り当てましょうtext="Hello\nWorld\n"
さて、
text.replaceAll("\n","/")
、text.replaceAll("\\n","/")
、text.replaceAll("\\\n","/")
これら3つすべてが同じ出力を与えますHello/World/
Java は、私が感じる最善の方法で正規表現をめちゃくちゃにしてしまったのです! 正規表現でこれらの遊び心のある動作を行う言語は他にないようです。Javaがこのように台無しになった特定の理由はありますか?