1

クリーンアップする必要があるさまざまなフィードからのデータのストリームがあります。

データは特定の形式であり、一部の文が複数の行にまたがる場合は、削除したい "\" (バックスラッシュ) を使用して区切ります。\ は、引用符などをエスケープするためにテキストの他の部分にも存在しますが、これらのバックスラッシュを削除したくありません。したがって、最終的には「\\n」を削除したいと思います。

\ と \n を削除するために次の正規表現を試しましたが、うまくいきませんでした:

singleLine.replaceAll("(\\\\n|\\\\r)", "");

この場合、どの正規表現が機能するかわかりません。

4

4 に答える 4

5

これには正規表現は必要ありません。私があなたなら、私は使うだろう...

singleLine=singleLine.replace("\\\\n", "");

多くの人は、replace メソッドは 1 つだけを置き換えると考えていますが、実際の唯一の違いは、replaceAll が正規表現を使用するのに対し、replace は文字列の正確な一致を単純に置き換えることです。

ただし、正規表現を使用したい場合は、 \\\\\\\\ を実行する必要があると思います(Javaと正規表現ではエスケープ文字を「無効化」する必要があるため、x2だけでなくx4)

これをもう少し説明すると

他の唯一の問題はあなたの例にあります.singeLineを何にも設定しないでください。あなたがそれを隠していたのか、見逃していたのかはわかりません。

編集: \\\\\\\\ の理由を説明すると、Java では、1 つの \ を表すために「\\」を実行する必要があります。正規表現には \ 文字も使用されるため、同じことをもう一度行う必要があります。Java で "\\" だけを使用すると、正規表現パーサーは基本的に "\" を受け取ります。これは、特定のものに対するエスケープ文字です。エスケープするには、正規表現パーサーにそれらのうちの 2 つを指定する必要があるため、Java では、単一の「\」の一致を表すためだけに「\\\\」を実行する必要があります。

于 2012-07-24T15:06:50.683 に答える
2

その正規表現のパターンごとに5つの円記号が必要です。

使用する:

singleLine.replaceAll("(\\\\\n|\\\\\r)", ""); 

バックスラッシュ文字は、文字列エスケープシーケンスであると同時に、正規表現のエスケープシーケンスでもあります。したがって、正規表現でリテラルを表すには、4文字\を使用する必要があります-正規表現はエスケープされたバックスラッシュを取得する必要があり、それらのそれぞれはJavaでエスケープする必要があります-次に、またはのいずれかを表すために別の文字を使用します。 \\\String\n\r

String str = "string with \\\n newline and \\\n newline ...";
String repl = str.replaceAll("(\\\\\n|\\\\\r)", "");
System.out.println("str: " + str);
System.out.println("repl: " + repl);

出力:

STR: string with \
 newline and \
 newline ...
REPL: string with  newline and  newline ...
于 2012-07-24T15:06:30.320 に答える
1

文字列は不変であるため、戻り値を別の文字列オブジェクトまたは同じオブジェクトに割り当てる必要があります。

singleLine = singleLine.replaceAll("(\\\\n|\\\\r)", "");

詳細はこちら

于 2012-07-24T15:06:49.457 に答える
1

文字列は不変であることを忘れないでください。これは、replaceAll() がsingleLine の文字列を変更しないことを意味します。変更された文字列を取得するには、戻り値を使用する必要があります。たとえば、次のことができます。

singleLine = singleLine.replaceAll("(\\\\n|\\\\r)", "");
于 2012-07-24T15:07:12.577 に答える