43

C#の正規表現を使用して、\nの孤立したインスタンスを\r \ n(LFのみとCRLF)に置き換えるにはどうすればよいですか?

ばかげた質問だとすみません、私は正規表現を初めて使用します。

私は次のような計画を使用してそれを行うことを知っていますString.Replace

myStr.Replace("\n", "\r\n");
myStr.Replace("\r\r\n", "\r\n");

ただし、これはエレガントではなく、テキストにすでに含まれている「\ r + \ r \ n」を破棄します(ただし、存在する可能性は低いです)。

4

7 に答える 7

67

これを使えばもっと速くなるかもしれません。

(?<!\r)\n

基本的に、前に \r が付いていない \n を探します。他のケースでは、ほとんどすべての文字が [^\r] に一致するため、これはおそらくより高速です。したがって、それをキャプチャし、その後に \n を探します。私が示した例では、\n が見つかったときにのみ停止し、その前に \r が見つかったかどうかを確認します。

于 2008-08-28T16:16:15.527 に答える
45

これでいいですか?

[^\r]\n

基本的には、「\r」ではない文字が前に付いた「\n」と一致します。

単一の「\n」で始まる行も検出する場合は、

([^\r]|$)\n

これは、「\ n」と一致する必要があることを示していますが、行の最初の文字であるもの、または「\r」が前に付いていないもののみです。

行自体の定義をいじっているので、チェックする特別な場合があるかもしれません。「$」はあまりうまく機能しないかもしれません。しかし、私はあなたがその考えを理解するべきだと思います。

編集: credit @Kibbee先読みを使用すると、一致する先行文字がキャプチャされず、エッジケースにも役立つため、明らかに優れています。したがって、より良い正規表現+コードは次のようになります。

myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");
于 2008-08-27T19:52:19.043 に答える
12

以下のコードを文字列に実行しようとしましたが、機能しませんでした。

myStr.Replace("(?<!\r)\n", "\r\n")

私はRegex.Replaceを使用しましたが、うまくいきました

Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")
于 2011-06-23T04:20:01.083 に答える
3

「myStr」はString型のオブジェクトだと思います。その場合、これは正規表現ではありません。\rと\nは、CRとLFに相当します。

私の推測では、各行に\ nがあることがわかっている場合は、何があっても、最初にすべての\rを削除する必要があります。次に、すべての\nを\r\nに置き換えます。

シャクリットが与える答えも行きますが、正規表現を使用する必要がありますが、「myStr」が何であるかを言わないので...

編集:他の例を見ると、1つのことがわかります..簡単にできるのに、なぜ難しいことをするのですか?、正規表現があるため、「使用する必要がある」と同じではありません:D

Edit2:正規表現やxpathなどをいじるときにツールは非常に価値があり、奇妙な結果が得られます。http://www.regexbuddy.com/

于 2008-08-27T19:57:01.090 に答える
1
myStr.Replace("([^\r])\n", "$1\r\n");

$は\である必要があるかもしれません

于 2008-08-27T19:57:26.143 に答える
1

これを試してください: Replace(Char.ConvertFromUtf32(13), Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13))

于 2011-08-05T04:24:49.343 に答える