文字列C#の改行を置き換える


回答:


715

置換を使用 Environment.NewLine

myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;

他の投稿で述べたように、文字列が別の環境(OS)からのものである場合は、その特定の環境の新しい行制御文字の実装を置き換える必要があります。


8
まず、それは私にはうまくいきませんでした。いくつかの調査の後、私は解決策を見つけました。「システムを使用して」を使用する必要がありました。または 'System.Environment.NewLine'
Smolla

12
すべての改行文字を削除しませんでした。この文字列を試してください"\ n \ r \ n私のメッセージ\ r \ n \ n \ r \ n is this。\ n \ n \ r \ n"
Shakti Prakash Singh

13
一般的に、私はこのソリューションが好きです。ただし、同じOSであっても、実際の改行は一致しない場合があります。これは、処理がSQLを返した理由です。新しい行は\ nでしたが、Environment.NewLineは\ r \ nでした。その結果、何も一致しなかったため、新しい行が残りました。
Dono 2013年

@Dono> SQLデータはどこから来ますか?おそらく、UNIXの方法で新しい行を扱う外部ソースからです。それは...データ形式ではなく、OSやこの方法の問題だ
ローラン・S.

これは、Stringクラスの静的メソッドの1つである必要があります。.NET自体は、文字列内のソース改行の形式を検出して、Environment.NewLineに変換できるはずです。\ r \ n形式...
Dean Kuga

442

これまでに投稿されたソリューションEnvironment.NewLineは、置換のみを行うか、置換文字列にstring.Replace複数回呼び出されるため改行が含まれている場合は失敗します。

これは、正規表現を使用して、文字列を1回パスするだけで3つすべての置換を行うソリューションです。つまり、置換文字列には改行を安全に含めることができます。

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

3
したがって、Regex.Replace(input、@ "[\ r \ n] +"、replacementString)を実行しても、同じタスクを実行できませんか?
flamebaud 2013年

7
@flamebaudいいえ、行に複数の改行がある場合は、異なる結果が生成されます。「\ r \ n?| \ n」は各改行を置き換え、「[\ r \ n] +」は任意の数の改行を1回置き換えます。
デビッドハモンド

複数の改行が心配な場合:/(\ r \ n?| \ n)/ gm
BobbyA

4
異なるOSからの文字列の改行を削除したい場合、これは実際には正しい解決策です。良い例はJSONフォーマットです。+1
Bastien Vandamme

1
逐語的文字列(@接頭辞)を使用しない場合は、使用するすべての場所で2つのバックスラッシュを続けて配置する必要があるため、上記の@mark_byersによる回答は依然として正しいです。@プレフィックスは、円記号が文字列の一部になるようにするため、Regexがエスケープ文字として使用するために必要です。
Kirk Liemohn 2017

173

The.Anyi.9の答えを拡張するには、一般的に使用されるさまざまな種類の改行にも注意する必要があります。あなたのファイルがどこから来たかに依存して、あなたはあなたがすべての選択肢をキャッチすることを確認することを見たいかもしれません...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

あなたを始めるべきだ...


6
最初に私は環境のほうが好きでしたが、文字列がシステムで実行されていない場合は機能しません。+1
Flo

1
Line.Replace("\n", replaceWith).Replace("\r", replaceWith);十分ではありませんか?
Thomas Ayoub、2015

5
いいえ、持っている\r\n場合、置換文字列が2回になるため、理想的ではありません。
ZombieSheep 2015

1
文字列リテラルは必要ありませんか?string deletedBreaks = Line.Replace(@ "\ r \ n"、replaceWith).Replace(@ "\ n"、replaceWith).Replace(@ "\ r"、replaceWith);
Shawn Dotey 2017年

2
@ShawnDoteyは必要ありません。バックスラッシュと文字のシーケンスではなく、制御文字を置き換えます。
N. Kudryavtsev 2018年

38

文字列の改行を挿入したいが、文字列からすべての改行を削除したくない場合は、Environment.Newlineを使用します。

プラットフォームによっては、異なるタイプの改行を使用できますが、同じプラットフォーム内でも、異なるタイプの改行が使用されることがよくあります。特にファイル形式とプロトコルを扱う場合。

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}

(正規表現パターンを簡単にするために)取得したWebページのコードを1行に折りたたみたいときに、これは私にとって唯一有効でした。
Paw Baltzersen、2011

ブライアン・R・ボンディに完全に同意します。Corinによって提供され、非常に賛成されたソリューションは、少なくとも非常に単純です。
カリフ

18

コードが異なる環境で実行されることになっている場合は、Environment.NewLine定数を使用することを検討します。定数newlineは特定の環境で使用されるためです。

line = line.Replace(Environment.NewLine, "newLineReplacement");

ただし、別のシステムで作成されたファイルからテキストを取得する場合、これは正しい答えではない可能性があるため、他のシステムで使用されている改行定数で置き換える必要があります。通常は\nまたはになり\r\nます。


置換は行われないため、元の変数に再度割り当てる必要があります。
tvanfosson 2008年

@drissファイルがどのシステムから来たのかわからないときに、正しい改行定数をどのように選ぶのか知りたい...この解決策は本当に普遍的なもののようです。
カリフ2013年

14

replaceは文字列の置き換えを行わないが、文字が置き換えられた新しい文字列を返すことを忘れないでください。以下は改行を削除します(それらを置き換えません)。@Brian R. Bondyのメソッドを、拡張メソッドとしてラップされている他のもので置き換える場合は、それを使用します。Replaceまたは提供されている拡張メソッドを呼び出す前に、まずnull値を確認してください。

string line = ...

line = line.Replace( "\r", "").Replace( "\n", "" );

拡張メソッドとして:

public static class StringExtensions
{
   public static string RemoveLineBreaks( this string lines )
   {
      return lines.Replace( "\r", "").Replace( "\n", "" );
   }

   public static string ReplaceLineBreaks( this string lines, string replacement )
   {
      return lines.Replace( "\r\n", replacement )
                  .Replace( "\r", replacement )
                  .Replace( "\n", replacement );
   }
}

''C#では使用できません。空の文字などはありません。う'\0'の代わりに動作しますか?
Shevek

1
@Shevek-間違った引用符を使用した。私がこれに答えた日には、かなりの量のJavaScriptを実行しているに違いありません。
tvanfosson 2010年

@Califf-それは同等で、良くはありません。
tvanfosson 2013年

2
ここでの間違いは、それがより良いことを証明するだけです。私が働いていたほとんどの会社は、それをコーディング標準にしています-ハードコードされた文字を使用しないでください。
カリフ2013

2
@Califf私が作成した「間違い」は、Intellisenseを使用するIDEで作成されたものでも、コンパイルされたものでもありません。それstring.Emptyが良かったら是非使ってください。
tvanfosson 2013

10

改行のすべての可能な方法(Windows、MacおよびUnix)を確実に置き換えるには、以下を使用する必要があります。

string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');

そして、この順序で、行末文字のいくつかの組み合わせを見つけたときに余分な改行を行わないようにします。


8

新しい行を「クリーン」にしたい場合@"[\r\n]+"は、正規表現を使用したフレームボーコメントが最適です。

using System;
using System.Text.RegularExpressions;

class MainClass {
  public static void Main (string[] args) {
    string str = "AAA\r\nBBB\r\n\r\n\r\nCCC\r\r\rDDD\n\n\nEEE";

    Console.WriteLine (str.Replace(System.Environment.NewLine, "-"));
    /* Result:
    AAA
    -BBB
    -
    -
    -CCC


    DDD---EEE
    */
    Console.WriteLine (Regex.Replace(str, @"\r\n?|\n", "-"));
    // Result:
    // AAA-BBB---CCC---DDD---EEE

    Console.WriteLine (Regex.Replace(str, @"[\r\n]+", "-"));
    // Result:
    // AAA-BBB-CCC-DDD-EEE
  }
}

ほとんどの場合、新しい行を置き換えるための最良の答えです。
Shahbaz Ahmad

この便利なサンプルコードをありがとう。私はこの構文を介して修正されました:Regex.Replace(str、@ "[\ r \ n] +"、 "-")
Sedat Kumcu

6

\r\n実際のキャリッジリターンとラインフィードに置き換え\t、実際のタブに置き換える必要がありました。だから私は次のことを思いつきました:

public string Transform(string data)
{
    string result = data;
    char cr = (char)13;
    char lf = (char)10;
    char tab = (char)9;

    result = result.Replace("\\r", cr.ToString());
    result = result.Replace("\\n", lf.ToString());
    result = result.Replace("\\t", tab.ToString());

    return result;
}

6

なぜ両方ではない?

string ReplacementString = "";

Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);

注:strin入力文字列の名前に置き換えます。



2

.Replace()メソッドを使用する

Line.Replace("\n", "whatever you want to replace with");

2

安全に改行を置き換える最良の方法は

yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n")             //handling mac linebreaks

これにより、改行として\ n(例:改行)のみの文字列が生成されます。このコードは、混合改行の修正にも役立ちます。


2

新ラインのようで区切ることができ\n\rそして\r\n最初の我々は交換するだろう、\r\r\nして\n、とだけにして、分割データ列。

次の行はparseCSVメソッドに移動する必要があります。

function parseCSV(data) {
    //alert(data);
    //replace UNIX new lines
    data = data.replace(/\r\n/g, "\n");
    //replace MAC new lines
    data = data.replace(/\r/g, "\n");
    //split into rows
    var rows = data.split("\n");
}

0
string s = Regex.Replace(source_string, "\n", "\r\n");

または

string s = Regex.Replace(source_string, "\r\n", "\n");

どちらに行きたいかによります。

それが役に立てば幸い。


0

別のオプションはStringReader、問題の文字列の上にオーバーを作成することです。リーダーでは.ReadLine()、ループで行います。次に、行の区切り記号(一貫性または不整合性)に関係なく、行を分離します。これで、希望どおりに続行できます。一つの可能性は使用aにありStringBuilder、コール.AppendLineことです。

利点は、何が「改行」を構成するかをフレームワークに決定させることです。


0

改行だけを置き換えたい場合:

var input = @"sdfhlu \r\n sdkuidfs\r\ndfgdgfd";
var match = @"[\\ ]+";
var replaceWith = " ";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input.Replace(@"\n", replaceWith).Replace(@"\r", replaceWith), match, replaceWith);
Console.WriteLine("output: " + x);

改行、タブ、空白を置き換える場合:

var input = @"sdfhlusdkuidfs\r\ndfgdgfd";
var match = @"[\\s]+";
var replaceWith = "";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input, match, replaceWith);
Console.WriteLine("output: " + x);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.