Wie kann ich alle Zeilenumbrüche aus einer Zeichenfolge in Java so ersetzen, dass sie unter Windows und Linux funktionieren (dh keine betriebssystemspezifischen Probleme mit Wagenrücklauf / Zeilenvorschub / neue Zeile usw.)?
Ich habe es versucht (Anmerkung readFileAsString ist eine Funktion, die eine Textdatei in einen String liest):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
aber das scheint nicht zu funktionieren.
Wie kann das gemacht werden?
java
string
newline
line-breaks
Baumhacker
quelle
quelle
myString.trim().replaceAll("[\n]{2,}", "\n")
oder durch ein einzelnes Leerzeichen ersetzenmyString.trim().replaceAll("[\n]{2,}", " ")
Antworten:
Sie müssen folgende
text
Ergebnisse erzielentext.replace()
:Dies ist erforderlich, da Strings unveränderlich sind. Durch Aufrufen
replace
wird der ursprüngliche String nicht geändert, sondern es wird ein neuer zurückgegeben, der geändert wurde. Wenn Sie das Ergebnis nicht zuweisentext
, geht dieser neue String verloren und der Müll wird gesammelt.Der Newline-String für jede Umgebung wird abgerufen, indem Sie ihn aufrufen
System.getProperty("line.separator")
.quelle
replace()
Methode gibt das gewünschte Ergebnis zurück. Siehe auch die API-Dokumente: java.sun.com/javase/6/docs/api/java/lang/… Bearbeiten: Ah, Sie haben das bereits selbst später bearbeitet :)text = text.replace("\r\n", " ").replace("\n", " ");
ist eine bessere Lösung: Andernfalls werden Wörter aneinander "geklebt" (ohne den Einzelraumersatz)..replaceAll("[\\r\\n]+", "")
text = text.replaceAll("\n", "").replaceAll("\r", "");
replaceAll
nimmt Regex auf,replace
nimmt Literalzeichenfolgen auf , beide ersetzen alle Vorkommen.Wie in anderen Antworten erwähnt, funktioniert Ihr Code in erster Linie nicht, da
String.replace(...)
das Ziel nicht geändert wirdString
. (Es kann nicht - Java-Zeichenfolgen sind unveränderlich!) Tatsächlichreplace
wird ein neuesString
Objekt erstellt und zurückgegeben, wobei die Zeichen nach Bedarf geändert werden. Aber Ihr Code wirft dann das wegString
...Hier sind einige mögliche Lösungen. Welches am besten ist, hängt davon ab, was genau Sie versuchen.
Entfernt einfach alle Zeilenumbruchzeichen. Dies ist nicht mit Windows- oder Mac-Leitungsbeendigungen möglich.
Entfernt alle Leitungsterminatoren für die aktuelle Plattform. Dies ist nicht der Fall, wenn Sie versuchen, beispielsweise eine UNIX-Datei unter Windows zu verarbeiten, oder umgekehrt.
Entfernt alle Windows-, UNIX- oder Mac-Zeilenabschlüsse. Wenn es sich bei der Eingabedatei jedoch um Text handelt, werden Wörter verkettet. z.B
wird
Vielleicht möchten Sie dies tatsächlich tun:
Dies ersetzt jeden Zeilenabschluss durch ein Leerzeichen. Seit Java 8 können Sie dies auch tun:
Und wenn Sie mehrere Zeilentrennzeichen durch ein Leerzeichen ersetzen möchten:
quelle
Wenn Sie nur Zeilenabschlüsse entfernen möchten, die auf dem aktuellen Betriebssystem gültig sind, können Sie Folgendes tun:
Wenn Sie sicherstellen möchten, dass alle Zeilentrennzeichen entfernt werden, können Sie dies folgendermaßen tun:
Oder etwas ausführlicher, aber weniger regexy:
quelle
text.replaceAll("(\\r|\\n)+", " ")
und (vorausgesetzt, Gier ist in Java Standard?) Sie haben eine Lösung mit nur einem Leerzeichen für jede Folge neuer Zeilenzeichen.Diese Funktion normalisiert alle Leerzeichen, einschließlich Zeilenumbrüche, auf einzelne Leerzeichen. Nicht genau das, wonach die ursprüngliche Frage gestellt hat, aber wahrscheinlich genau das, was in vielen Fällen benötigt wird:
quelle
Das wäre effizient, denke ich
quelle
Funktionierte perfekt für mich, nachdem ich viel gesucht hatte, nachdem ich mit jeder anderen Zeile versagt hatte.
quelle
Zeilenumbrüche sind unter Windows / Linux / Mac nicht identisch. Sie sollten System.getProperties mit dem Attribut line.separator verwenden.
quelle
.replace gibt eine neue Zeichenfolge zurück. Zeichenfolgen in Java sind unveränderlich.
quelle
Möglicherweise möchten Sie Ihre Datei mit einem lesen
BufferedReader
. Diese Klasse kann Eingaben in einzelne Zeilen aufteilen, die Sie nach Belieben zusammenstellen können. Die FunktionsweiseBufferedReader
erkennt Zeilenendkonventionen der Linux-, Windows- und MacOS-Welt automatisch, unabhängig von der aktuellen Plattform.Daher:
Beachten Sie, dass der
readLine()
Zeilenabschluss nicht in der zurückgegebenen Zeichenfolge enthalten ist. Der obige Code fügt ein Leerzeichen hinzu, um zu vermeiden, dass das letzte Wort einer Zeile und das erste Wort der nächsten Zeile zusammengeklebt werden.quelle
Obwohl die Definition von trim () in der Oracle-Website "Gibt eine Kopie der Zeichenfolge zurück, wobei führende und nachfolgende Leerzeichen weggelassen werden".
In der Dokumentation wird nicht angegeben, dass auch neue Zeilenzeichen (führende und nachfolgende) entfernt werden.
Kurz gesagt,
String text = readFileAsString("textfile.txt").trim();
wird auch für Sie arbeiten. (Mit Java 6 überprüft)quelle
Ich finde es seltsam, dass (Apache) StringUtils hier noch nicht behandelt wurde.
Mit der
.replace
Methode können Sie alle Zeilenumbrüche (oder andere Vorkommen eines Teilstrings) aus einer Zeichenfolge entfernenDiese Zeile ersetzt alle Zeilenumbrüche durch die leere Zeichenfolge.
Da newline technisch gesehen ein Zeichen ist, können Sie optional die
.replaceChars
Methode verwenden, die Zeichen ersetztquelle
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Zu Ihrer Information, wenn Sie gleichzeitige Mehrzeilenbrüche durch einen einzelnen Zeilenumbruch ersetzen möchten, können Sie verwenden
Oder durch ein einzelnes Leerzeichen ersetzen
quelle
Sie können Apache Commons IOUtils verwenden, um die Zeile zu durchlaufen und jede Zeile an StringBuilder anzuhängen. Und vergessen Sie nicht, den InputStream zu schließen
quelle
Sie können generische Methoden verwenden, um jedes Zeichen durch ein beliebiges Zeichen zu ersetzen.
quelle
org.apache.commons.lang.StringUtils # chopNewline
quelle
Versuchen Sie Folgendes:
quelle
\n
gibt es keine\r\n
mehr, wenn Sie \ n ersetzen, und es gibt ein \\ n, das ersetzt wird, sodass nur das \ übrig bleibt.