2017-08-25 14 views
2

特定の文字(改行など)が一致すると、正規表現「\\ n」または実際には「\ n」を使用できます。例えば、以下はラインの配列に文字列を分割します。Java正規表現エスケープ文字

String[] lines = allContent.split("\\r?\\n"); 

しかし、単にだけでなく、次の作品:

String[] lines = allContent.split("\r?\n"); 

私の質問:

における上記の二つの作業を実行します。正確にと同じ方法で、またはそこに微妙な違いはありますか?後者の場合は、異なる結果が得られる例を挙げることができますか?

[可能性/理論上]のパフォーマンスのみに違いはありますか?

+2

違いはありません。 '\\ n'はLFと一致し、' \ n'はLFと一致します。 –

+2

コメントモードを使用する場合は、違いがあります。 –

+0

@SebastianProskeそれは本当です。現在の正規表現を考えると、違いはありません。 '(?x)'が使用されている場合、空白文字はJava正規表現でエスケープする必要があります。彼らが文字クラスで使用されていても。 –

答えて

2

現在のシナリオには違いはありません。通常の文字列エスケープシーケンスはリテラルバックスラッシュのヘルプ(を用いて形成されている単一のバックスラッシュの助けを借りた後、有効なエスケープ文字("\n""\r"、など)と正規表現エスケープシーケンスで形成されていることがあり、 Java文字列リテラルの二重バックスラッシュ)と有効な正規表現エスケープ文字("\\n""\\d"など)を使用します。

"\n"エスケープシーケンス)がリテラルLF(改行)であり"\\n"はLFシンボルと一致する正規表現エスケープシーケンスです。

"\r"エスケープシーケンス)がリテラルCR(キャリッジリターン)であり"\\r"はCRシンボルに一致する正規表現エスケープシーケンスです。

regex escapeのサポートリストについては、Java regex docsのリストを参照してください。

ただし、Pattern.COMMENTS flag(正規表現エンジンは、パターン内のすべてのエスケープされていない空白を無視すること、コメントをご紹介してきれいにパターンをフォーマットするために使用される)、あなたは(改行を定義するために"\\n"または"\\\n"を使用するかLFが必要になります使用している場合)をJava文字列リテラルに、"\\r"または"\\\r"を使用してキャリッジリターン(CR)を定義します。

Java testを参照してください:

String s = "\n"; 
System.out.println(s.replaceAll("\n", "LF")); // => LF 
System.out.println(s.replaceAll("\\n", "LF")); // => LF 
System.out.println(s.replaceAll("(?x)\\n", "LF")); // => LF 
System.out.println(s.replaceAll("(?x)\\\n", "LF")); // => LF 
System.out.println(s.replaceAll("(?x)\n", "<LF>")); 
// => <LF> 
//<LF> 

なぜ<LF> +改行+ <LF>を生産する最後のものはありますか? "(?x)\n"""に等しいので、空のパターンであり、改行の前と後の空のスペースに一致します。

0

はい異なるです。 JavaコンパイラのUnicode Escapesの動作は、Java Book The Java Language仕様セクション3.3で異なります。

Javaプログラミング言語は、ASCIIベースのツールで処理できる 形式にプログラムを変更するASCIIにUnicode文字で書かれた プログラムを変換する標準的な方法を指定します。 ソーステキストの非ASCII文字を同時に含むUnicodeエスケープに変換すると同時に、 のプログラムのソーステキストのUnicodeエスケープをASCIIに変換します。たとえば、\ uxxxxは \ uuxxxxになります。それぞれ1つのu。

だから、これは中/のn対//nにどのように影響するかをJava Doc

これは、文字列リテラル内の二重のバックスラッシュすることが必要であるJavaバイトコードによって解釈 からそれらを保護するために正規表現を表す コンパイラ。

アン同じドキュメントの例:「\ bの」ながら

文字列リテラル「\ b」は、例えば、正規表現として解釈シングルバックスペース 文字にマッチし 単語境界に一致します。文字列リテラル "(hello)"は不正で、 はコンパイル時エラーを引き起こします。文字列(hello) と一致させるには、文字列リテラル "\(hello \)"を使用する必要があります。

+1

Java文字列リテラルで単一のリテラル・バックスラッシュを定義するには、 '' \\ "'を使用する必要性について説明しています。 OPの質問は、 "\ n"と "" \\ n ""が同じ文字列にマッチするかどうかです。パターンは異なりますが、同じテキストに一致します。だから、私は、現状のシナリオでは違いはないと言っている*。 –

+0

はいあなたの答えは正しい私はちょうどそれらの違いが欲しかったです。いくつかのシナリオでは異なる結果があり、他のシナリオでは同じ結果が得られます。 – Gatusko