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.
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 .
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);
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.
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.
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.
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","");
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:
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:
publicstringTransform(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;}
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.
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 rowsvar rows = data.split("\n");}
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.
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);
Antworten:
Verwenden Sie ersetzen durch
Environment.NewLine
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 .
quelle
Die bisher veröffentlichten Lösungen ersetzen entweder nur
Environment.NewLine
oder sie schlagen fehl, wenn die Ersetzungszeichenfolge Zeilenumbrüche enthält, da siestring.Replace
mehrmals 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.
quelle
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 ...
sollte dich zum Laufen bringen ...
quelle
Line.Replace("\n", replaceWith).Replace("\r", replaceWith);
genug?\r\n
Sie die Ersatzzeichenfolge zweimal - nicht ideal.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.
quelle
Wenn Ihr Code in verschiedenen Umgebungen ausgeführt werden soll, würde ich die Verwendung der
Environment.NewLine
Konstante in Betracht ziehen , da diese speziellnewline
in der jeweiligen Umgebung verwendet wird.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
\n
oder sein\r\n
.quelle
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.
Als Erweiterungsmethoden:
quelle
''
in C # haben - es gibt kein leeres Zeichen. wird'\0'
stattdessen funktionieren?string.Empty
besser ist, verwenden Sie es auf jeden Fall.Um sicherzustellen, dass alle möglichen Arten von Zeilenumbrüchen (Windows, Mac und Unix) ersetzt werden, sollten Sie Folgendes verwenden:
und in dieser Reihenfolge, um keine zusätzlichen Zeilenumbrüche zu machen, wenn Sie eine Kombination von Zeichen für das Zeilenende finden.
quelle
Wenn Sie die neuen Zeilen "bereinigen" möchten, ist ein Flammenbaud-Kommentar mit Regex
@"[\r\n]+"
die beste Wahl.quelle
Ich musste das
\r\n
durch einen tatsächlichen Wagenrücklauf und Zeilenvorschub ersetzen und durch\t
eine tatsächliche Lasche ersetzen . Also habe ich mir Folgendes ausgedacht:quelle
Warum nicht beide?
Hinweis: Ersetzen Sie
strin
durch den Namen Ihrer Eingabezeichenfolge.quelle
quelle
Verwenden Sie die Methode .Replace ()
quelle
Der beste Weg, um Zeilenumbrüche sicher zu ersetzen, ist
das sollte einen String mit nur \ n (zB Zeilenvorschub) als Zeilenumbruch erzeugen. Dieser Code ist nützlich, um auch gemischte Zeilenumbrüche zu beheben.
quelle
Da eine neue Zeile durch und begrenzt werden
\n
kann , werden wir zuerst und durch ersetzen und erst dann die Datenzeichenfolge teilen.\r
\r\n
\r
\r\n
\n
Die folgenden Zeilen sollten zur
parseCSV
Methode gehen:quelle
oder
je nachdem welchen Weg du gehen willst.
Hoffe es hilft.
quelle
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 verwendenStringBuilder
und es aufzurufen.AppendLine
.Der Vorteil ist, dass Sie das Framework entscheiden lassen, was einen "Zeilenumbruch" ausmacht.
quelle
Wenn Sie nur die Zeilenumbrüche ersetzen möchten:
Wenn Sie Zeilenumbrüche, Tabulatoren und Leerzeichen ersetzen möchten:
quelle