2016-12-03 5 views
3

次のコードを試していますが、それは誤って印刷されています。 これは本当に印刷されると予想されました。 さらに、Pattern.Compile()statemenetは警告「冗長エスケープ文字」を返します。 これが本当に戻ってこない理由と、なぜ警告が表示されるのか、誰かが助けてくれますか?パターン内の冗長エスケープ文字

public static void main(String[] args) { 
    String s = "\\n"; 
    System.out.println(s); 

    Pattern p = Pattern.compile("\\\n"); 
    Matcher mm = p.matcher(s); 
    System.out.println(mm.matches()); 
} 
+0

\\ N = \\\のn - あなたが比較されている文字 'n' は改行の '\ n' は – MotKohn

答えて

3

s="\\n"は、変数sにバックスラッシュとnを割り当てる意味し、それは2つの文字、\n配列を含みます。

Pattern.compile("\\\n")は、改行文字と一致する正規表現パターン\nを定義することを意味します。したがって、このパターンは変数sの文字列と一致しません。

冗長エスケープ警告がリテラルC文字列でトリプルバックスラッシュを使用しているという事実に関連している:すなわち、2つのバックスラッシュは文字通りのバックスラッシュを定義し、三番目が冗長であるリテラル\、その後、改行のエスケープシーケンスがあります"\n"であり、リテラルのバックスラッシュ(リテラルに2つのバックスラッシュで定義されています)が冗長であり、削除できることを意味します。

+0

\\ n個で手段\とn文字。パターンの\\\ nは、\\ nを意味する必要があります。つまり、\とnに一致する必要があります。 – Raj

+0

バックスラッシュと 'n'を含む文字列を照合するには' String pattern = "\\\\ n" 'が必要です。バックスラッシュをマッチさせるには、正規表現エンジンに渡される文字列の2つのバックスラッシュを表す文字列リテラルに4つのバックスラッシュが必要です。 –

+0

それで、あなたの質問に答えるかどうか教えてください。そうでない場合は、コードを共有したり、*実際のシナリオを説明してください*。 –

0

あなたのソースsは、2つの文字、'\''n'を持っているあなたはそれが改行で\を追ったことになるものであれば、それは"\\\n"

パターンであるべき2つの文字「\」と「\ nの」(ラインを持っています\)エスケープ文字は必要ありません。あなたが\を改行した後であれば、それは"\\\\\n"でなければなりません(正規表現とそれから\ nをエスケープするために\を2回続けてください)。

String s = "\\\n"; 
    System.out.println(s); 

    Pattern p = Pattern.compile("\\\\\n"); 

    Matcher mm = p.matcher(s); 
    System.out.println(mm.matches()); 
3

"\\\n"は、バックスラッシュ\\、その後、改行\nと評価されている間"\\n" evaulatesは\\と手紙nをバックスラッシュするので。

0

Javaソースコードの文字列リテラル内のバックスラッシュは、Unicodeエスケープ(3.3節)またはその他の文字エスケープ(3.10.6節)のいずれかとしてJava™言語仕様で必要と解釈されます。したがって、文字列リテラルのバックスラッシュそれらはJavaバイトコードコンパイラによる解釈からそれらを保護するための正規表現を表します。たとえば、文字列リテラル "\ b"は、正規表現として解釈されるときは単一のバックスペース文字に一致し、 "\\b"は単語境界に一致します。

参照してください!https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

関連する問題