Ersetzen Sie Zeilenumbrüche in einem String C #

512

Wie kann ich Zeilenumbrüche innerhalb einer Zeichenfolge in C # ersetzen?

YonahW
quelle
2
Bitte erzählen Sie uns mehr: Was ist für Sie ein "Zeilenumbruch"? Womit möchten Sie sie ersetzen?
Jay Bazuzi
ha ha. Ich habe das gleiche in Java überprüft, als ich herausfand, dass System.getProperty ("line.separator") neugierig war, das Gegenstück in C # zu kennen. Ihr Beitrag hat mir geholfen.
Ravisha

Antworten:

715

Verwenden Sie ersetzen durch Environment.NewLine

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

Wie in anderen Beiträgen erwähnt, müssen Sie, wenn die Zeichenfolge aus einer anderen Umgebung (OS) stammt, die Implementierung neuer Zeilensteuerungszeichen in dieser bestimmten Umgebung ersetzen .

Corin Blaikie
quelle
8
Zuerst hat es bei mir nicht funktioniert. Nach einigen Recherchen fand ich die Lösung: Ich musste 'using System' verwenden; oder 'System.Environment.NewLine'
Smolla
12
Nicht alle Zeilenumbrüche entfernt. Versuchen Sie diese Zeichenfolge "\ n \ r \ nMeine Nachricht \ r \ n \ n \ r \ n ist dies. \ N \ n \ r \ n"
Shakti Prakash Singh
13
Im Allgemeinen gefällt mir diese Lösung. Beachten Sie jedoch, dass selbst unter demselben Betriebssystem die tatsächlichen Zeilenumbrüche möglicherweise nicht übereinstimmen. Dies ist mir passiert, warum die Verarbeitung SQL zurückgegeben hat. Die neuen Zeilen waren \ n, während Environment.NewLine \ r \ n war. Das Ergebnis war, dass nichts übereinstimmte, so dass die neuen Linien blieben.
Dono
@Dono> Woher kommen die SQL-Daten? Wahrscheinlich von einer externen Quelle, die sich auf UNIX-Weise mit neuen Zeilen befasst. Das ist ein Problem mit dem Datenformat, nicht mit dem Betriebssystem oder dieser Methode ...
Laurent S.
Dies sollte eine der statischen Methoden der String-Klasse sein. .NET selbst sollte in der Lage sein, das Format von Quellzeilenumbrüchen in einer Zeichenfolge zu erkennen und in das Format Environment.NewLine \ r \ n zu konvertieren ...
Dean Kuga
442

Die bisher veröffentlichten Lösungen ersetzen entweder nur Environment.NewLineoder sie schlagen fehl, wenn die Ersetzungszeichenfolge Zeilenumbrüche enthält, da sie string.Replacemehrmals aufgerufen werden.

Hier ist eine Lösung, die einen regulären Ausdruck verwendet, um alle drei Ersetzungen in nur einem Durchgang über die Zeichenfolge vorzunehmen. Dies bedeutet, dass die Ersatzzeichenfolge sicher Zeilenumbrüche enthalten kann.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);
Mark Byers
quelle
3
Ihr Sprichwort "Regex.Replace" (Eingabe, @ "[\ r \ n] +", replaceString) würde also nicht dieselbe Aufgabe erfüllen?
Flamebaud
7
@flamebaud Nein, das würde zu einem anderen Ergebnis führen, wenn mehrere Zeilenumbrüche in einer Reihe vorhanden sind. "\ r \ n? | \ n" würde jeden Zeilenumbruch ersetzen, während "[\ r \ n] +" eine einzelne Ersetzung für eine beliebige Anzahl von Zeilenumbrüchen durchführen würde.
David Hammond
Für diejenigen, die sich Sorgen um mehrere Zeilenumbrüche machen: / (\ r \ n? | \ N) /
gm
4
Dies ist eigentlich die richtige Lösung, wenn Sie Zeilenumbrüche in einer Zeichenfolge entfernen möchten, die möglicherweise von einem anderen Betriebssystem stammt. Ein gutes Beispiel ist die JSON-Formatierung. +1
Bastien Vandamme
1
Wenn die wörtliche Zeichenfolge (@ -Präfix) nicht verwendet wird, müssen Sie überall dort, wo sie verwendet wird, zwei umgekehrte Schrägstriche hintereinander haben, damit die Antwort von @mark_byers oben immer noch korrekt ist. Das @ -Präfix macht es so, dass der Backslash Teil der Zeichenfolge ist, die Regex als Escape-Zeichen verwenden muss.
Kirk Liemohn
173

Um die Antwort von The.Anyi.9 zu erweitern, sollten Sie auch die verschiedenen Arten von Zeilenumbrüchen im allgemeinen Gebrauch kennen . Abhängig davon, woher Ihre Datei stammt, sollten Sie prüfen, ob Sie alle Alternativen finden ...

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

sollte dich zum Laufen bringen ...

ZombieSheep
quelle
6
Zuerst mochte ich die Umgebung besser, aber wenn der String nicht von dem System kommt, auf dem er läuft, funktioniert er nicht. +1
Flo
1
ist nicht Line.Replace("\n", replaceWith).Replace("\r", replaceWith);genug?
Thomas Ayoub
5
Nein, denn wenn Sie haben, erhalten \r\nSie die Ersatzzeichenfolge zweimal - nicht ideal.
ZombieSheep
1
Benötigen Sie keine String-Literale? Zeichenfolge removeBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
Shawn Dotey
2
@ShawnDotey keine Notwendigkeit, wir möchten Steuerzeichen ersetzen, nicht Sequenzen von Backslash und Buchstaben.
N. Kudryavtsev
38

Ich würde Environment.Newline verwenden, wenn ich eine neue Zeile für eine Zeichenfolge einfügen möchte, aber nicht alle neuen Zeilen aus einer Zeichenfolge entfernen möchte.

Abhängig von Ihrer Plattform können Sie verschiedene Arten von Zeilenumbrüchen verwenden, aber selbst innerhalb derselben Plattform werden häufig unterschiedliche Arten von Zeilenumbrüchen verwendet. Insbesondere beim Umgang mit Dateiformaten und Protokollen.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
Brian R. Bondy
quelle
Dies ist das einzige, was für mich funktioniert hat, als ich einen abgerufenen Webseitencode in eine einzelne Zeile reduzieren wollte (um Regex-Muster zu vereinfachen).
Paw Baltzersen
Stimme Brian R. Bondy voll und ganz zu. Die von Corin angebotene und so viel positiv bewertete Lösung ist zumindest sehr naiv.
Califf
18

Wenn Ihr Code in verschiedenen Umgebungen ausgeführt werden soll, würde ich die Verwendung der Environment.NewLineKonstante in Betracht ziehen , da diese speziell newlinein der jeweiligen Umgebung verwendet wird.

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

Wenn Sie jedoch den Text aus einer Datei erhalten, die von einem anderen System stammt, ist dies möglicherweise nicht die richtige Antwort. Sie sollten ihn durch die auf dem anderen System verwendete Zeilenumbruchkonstante ersetzen. Es wird typischerweise \noder sein \r\n.

driis
quelle
Sie müssen es wieder der ursprünglichen Variablen zuweisen, da keine Ersetzung erfolgt.
Tvanfosson
@driss Ich würde gerne wissen, wie Sie eine richtige neue Zeilenkonstante auswählen würden, wenn Sie keine Ahnung haben, von welchem ​​System eine Datei stammt ... diese Lösung scheint wirklich UNIVERSAL zu sein.
Califf
14

Vergessen Sie nicht, dass Ersetzen nicht das Ersetzen in der Zeichenfolge durchführt, sondern eine neue Zeichenfolge mit den ersetzten Zeichen zurückgibt. Im Folgenden werden Zeilenumbrüche entfernt (nicht ersetzt). Ich würde die Methode von @Brian R. Bondy verwenden, wenn ich sie durch etwas anderes ersetzen würde, vielleicht als Erweiterungsmethode. Denken Sie daran, zuerst nach Nullwerten zu suchen, bevor Sie Replace oder die bereitgestellten Erweiterungsmethoden aufrufen.

string line = ...

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

Als Erweiterungsmethoden:

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 );
   }
}
Tvanfosson
quelle
kann nicht ''in C # haben - es gibt kein leeres Zeichen. wird '\0'stattdessen funktionieren?
Shevek
1
@ Shevek - habe nur die falschen Anführungszeichen verwendet. Muss an dem Tag, an dem ich darauf geantwortet habe, ziemlich viel Javascript gemacht haben.
Tvanfosson
@Califf - es ist gleichwertig, nicht besser.
Tvanfosson
2
Der Fehler, den Sie hier gemacht haben, beweist nur, dass es besser ist. Die meisten Unternehmen, für die ich gearbeitet habe, haben den Codierungsstandard - VERWENDEN SIE KEINE HARDCODIERTEN LITERALIEN.
Califf
2
@Califf Der "Fehler", den ich gemacht habe, wäre weder in einer IDE mit Intellisense gemacht noch kompiliert worden. Wenn Sie der Meinung sind, dass dies string.Emptybesser ist, verwenden Sie es auf jeden Fall.
Tvanfosson
10

Um sicherzustellen, dass alle möglichen Arten von Zeilenumbrüchen (Windows, Mac und Unix) ersetzt werden, sollten Sie Folgendes verwenden:

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

und in dieser Reihenfolge, um keine zusätzlichen Zeilenumbrüche zu machen, wenn Sie eine Kombination von Zeichen für das Zeilenende finden.

Dominik Szymański
quelle
8

Wenn Sie die neuen Zeilen "bereinigen" möchten, ist ein Flammenbaud-Kommentar mit Regex @"[\r\n]+"die beste Wahl.

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
  }
}
ewwink
quelle
In den meisten Fällen die beste Antwort, um neue Leitungen zu ersetzen.
Shahbaz Ahmad
Vielen Dank für diesen nützlichen Beispielcode. Ich wurde über dieses System behoben: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu
6

Ich musste das \r\ndurch einen tatsächlichen Wagenrücklauf und Zeilenvorschub ersetzen und durch \teine tatsächliche Lasche ersetzen . Also habe ich mir Folgendes ausgedacht:

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;
}
Zamir
quelle
6

Warum nicht beide?

string ReplacementString = "";

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

Hinweis: Ersetzen Sie strindurch den Namen Ihrer Eingabezeichenfolge.

STRAHL
quelle
4
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Matt Hinze
quelle
2

Verwenden Sie die Methode .Replace ()

Line.Replace("\n", "whatever you want to replace with");
The.Anti.9
quelle
2

Der beste Weg, um Zeilenumbrüche sicher zu ersetzen, ist

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

das sollte einen String mit nur \ n (zB Zeilenvorschub) als Zeilenumbruch erzeugen. Dieser Code ist nützlich, um auch gemischte Zeilenumbrüche zu beheben.

Daten
quelle
2

Da eine neue Zeile durch und begrenzt werden \nkann , werden wir zuerst und durch ersetzen und erst dann die Datenzeichenfolge teilen.\r\r\n\r\r\n\n

Die folgenden Zeilen sollten zur parseCSVMethode gehen:

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");
}
Amrik
quelle
0
string s = Regex.Replace(source_string, "\n", "\r\n");

oder

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

je nachdem welchen Weg du gehen willst.

Hoffe es hilft.


quelle
0

Eine andere Möglichkeit besteht darin, eine StringReaderÜber-String-Zeichenfolge zu erstellen . Führen Sie auf dem Reader .ReadLine()eine Schleife durch. Dann haben Sie die Zeilen getrennt, egal welche (konsistenten oder inkonsistenten) Trennzeichen sie hatten. Damit können Sie fortfahren, wie Sie möchten; Eine Möglichkeit besteht darin, a zu verwenden StringBuilderund es aufzurufen .AppendLine.

Der Vorteil ist, dass Sie das Framework entscheiden lassen, was einen "Zeilenumbruch" ausmacht.

Jeppe Stig Nielsen
quelle
0

Wenn Sie nur die Zeilenumbrüche ersetzen möchten:

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);

Wenn Sie Zeilenumbrüche, Tabulatoren und Leerzeichen ersetzen möchten:

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);
Tadej
quelle