2012-03-24 3 views
23

Ich habe eine Zeichenfolge und möchte einfach alle darin enthaltenen Zeilenumbrüche durch die Zeichenfolge " --linebreak-- " ersetzen.Java Regex - Ersetzen von Zeilenumbrüchen durch die replaceAll-Methode von String

Wäre es nur schreiben genug sein:

string = string.replaceAll("\n", " --linebreak-- "); 

ich mit dem regex ein Teil davon bin verwirrt. Brauche ich zwei Schrägstriche für den Zeilenumbruch? Ist das gut genug?

+1

Entweder arbeitet verwenden. Siehe die Antworten auf [diese Frage] (http://stackoverflow.com/questions/9113328/java-regular-expression-need-to-escape-backlash-in-regex) für eine großartige Erklärung. –

Antwort

32

Verwenden Sie keine Regex!. Sie brauchen nur eine Klartextübereinstimmung, um "\n" zu ersetzen.

string = string.replace("\n", " --linebreak-- "); 

Beachten Sie, dass replace() ersetzt noch alle Vorkommen, wie replaceAll() tut - der Unterschied ist, dass replaceAll() regex suchen verwendet:

Verwenden replace() eine Zeichenkette durch eine andere zu ersetzen.

+2

Also sagst du replace() in einer Schleife anstelle von replaceAll() einmal zu verwenden? Ich verstehe nicht, warum das eine bessere Idee ist? – Tim

+4

@Tim Calling 'replace()' * einmal * ersetzt * alle * Vorkommen (keine "Schleife" erforderlich) – Bohemian

+0

Oh wow. Danke, aus irgendeinem Grund habe ich das übersehen, als ich die Spezifikation gelesen habe. – Tim

3

Keine Notwendigkeit für 2 backslashes.

String string = "hello \n world" ; 
String str = string.replaceAll("\n", " --linebreak-- "); 
System.out.println(str); 

Output = hello --linebreak-- world

29

Verwenden Sie den folgenden regulären Ausdruck:

s.replaceAll("\\r?\\n", " --linebreak-- ") 

Es gibt nur wirklich zwei Zeilenumbrüche für UNIX und Windows-Betriebssystem.

1

für neue Linie ist es eine Eigenschaft

System.getProperty("line.separator") 

Hier wie für Beispiel

string.replaceAll("\n", System.getProperty("line.separator")); 
2

gerade hinzufügen, diese auf Vollständigkeit, da das 2 Backslash was real ist.

Siehe Antwort auf die folgende Frage SO @dasblinkenlight (reden über \ t, aber es gilt für \ n als auch):

java, regular expression, need to escape backslash in regex

„Es gibt zwei Interpretationen von Escape-Sequenzen los: zuerst Wenn der Java-Compiler zwei Schrägstriche sieht, ersetzt er sie durch einen einzigen Schrägstrich. Wenn t nach einem Schrägstrich folgt, ersetzt Java ihn durch einen Tabulator. Schrägstrich, Java lässt es in Ruhe. Da jedoch zwei Schrägstriche durch einen einzigen Schrägstrich ersetzt wurden, sieht die reguläre Suchmaschine \ t und interpretiert sie als Tabulatorzeichen. "

+0

Die andere Sache, die passiert, ist, dass der erste arg zu ersetzenAll eine flache Zeichenfolge oder eine Regex sein kann. In einem String wird "\ n" als Literal interpretiert, aber wenn Sie andere Regex-Only-Symbole wie Klammern für Charsets verwenden, benötigen Sie den zusätzlichen Schrägstrich, um die richtige Zeichenfolge für den Regex-Compiler zu erhalten, wie Sie sagen. ..... zB "[\\ r \\ n] +" – Rondo

10

Seit Java 8 Regex-Engine unterstützt \R, die ein beliebiges Linientrennzeichen darstellt (wenig mehr Info: https://stackoverflow.com/a/31060125/1393766).

Also, wenn Sie den Zugriff auf Java 8 haben, können Sie

string = string.replaceAll("\\R", " --linebreak-- ");