24

この線

System.out.println("\\");

単一のバックスラッシュ ( \) を出力します。と

System.out.println("\\\\");

二重バックスラッシュ ( \\) を出力します。了解した!

しかし、なぜ次のコードで:

class ReplaceTest
{
    public static void main(String[] args)
    {
        String s = "hello.world";
        s = s.replaceAll("\\.", "\\\\");
        System.out.println(s);
    }
}

出力は次のとおりです。

hello\world

それ以外の

hello\\world

結局のところ、replaceAll()メソッドはドット ( \\.) を ( \\\\) に置き換えています。

誰かがこれを説明できますか?

4

7 に答える 7

26

\1正規表現を使用して文字を置換する場合、一致内のグループ化を使用して a を置換するなど、後方参照を使用できます。

ただし、これはバックスラッシュが特殊文字であることを意味するため、実際にバックスラッシュを使用する場合はエスケープする必要があります。

つまり、Java 文字列で使用する場合、実際には 2 回エスケープする必要があります。(最初は文字列パーサー用、次に正規表現パーサー用です。)

于 2012-06-02T20:38:00.937 に答える
19

replaceAllの javadoc には次のように書かれています。

置換文字列にバックスラッシュ ( \ ) とドル記号 ($) を使用すると、リテラル置換文字列として扱われる場合とは結果が異なる場合があることに注意してください。Matcher.replaceAll を参照してください。必要に応じて、 Matcher.quoteReplacement(java.lang.String) を使用して、これらの文字の特別な意味を抑制します。

于 2012-06-02T20:38:38.683 に答える
4

これは私のコメントへのフォーマットされた補遺です

s = s.replaceAll("\\.", Matcher.quoteReplacement("\\"));  

よりも読みやすく、意味のあるものです

s = s.replaceAll("\\.", "\\\\\\");
于 2013-10-02T10:20:52.690 に答える
0

バックスラッシュは、Java Strings のエスケープ文字です。たとえば、バックスラッシュには Java で定義済みの意味があります。バックスラッシュを 1 つ定義するには、「\ \」を使用する必要があります。" \ w" を定義したい場合は、正規表現で "\ \ w" を使用する必要があります。バックスラッシュをリテラルとして使用する場合は、\ \ \ \ と入力する必要があります。これは、\ が正規表現のエスケープ文字でもあるためです。

于 2012-06-02T20:49:08.017 に答える
0

この特定のケースでは、すべてを置換するよりも置換を使用する方が簡単だと思います。ゴンゾ牧師 キャラクターからの脱出について話すと、正解があります。

replaceAll の使用:

s = s.replaceAll("\\.", "\\\\\\\\");

置換の使用:

s = s.replaceAll(".", "\\");

replace は、正規表現ではなく、一致する文字列を取るだけです。

于 2014-12-13T00:50:43.087 に答える