String und \n. Habe wohl gerade Brett vorm Kopf

Thallius

Top Contributor
Hi,

irgendwie bion ich gerade wohl Betreibsblind.

Ich lese mit jdom eine XML ein. In einem der tags steht ein String

Teil1\nTeil2

Diesen will ich nun splitten am \n.

Normal geht das doch mit

string.split("[\\r\\n]+");

aber das macht er nicht. Gebe ich den String mit System.out.println() aus, dann steht da

Teil1\nTeil2

Der String stimmt also. Aber was ist falsch?

Gruß

Claus
 
string.split("[\\r\\n]+");

Du hast im XML einen einfachen String stehen dort wird "\n" als 2 Zeichen angesehen nicht als Zeilenumbruch!

Probiere es mit
Code:
string.split("\\\n");
. Durch den doppelten "\" wird der eigentliche "\" escaped, und dann ganz normal ein "n" dahinter
 
Zuletzt bearbeitet:
Ich weiß nicht es sieht in odnung aus. Geht das auch im kleinen Rahmen?

Java:
public class Test {
	
	public static void main(String[] args) {
		String test = "Test1 \n Test2";
		String[] testsplit = test.split("[\\r\\n]+");
		for(String s : testsplit) {
			System.out.println(s.trim());
		}
	}
}
 
BTW: Das ist OS-Abhängig. Windows macht Zeilenumbrüche immer mit dem bescheuerten \r\n, *nix-Systeme verwenden einfach nur ein \n. Ich würde auch eigentlich immer nur auf \n gehen und hinterher auf den Stücken des Strings im Zeifelsfall ein #trim() machen (entfernt Whitespace-Chars, ich glaube, das kickt eben auch \r weg).
 
Zuletzt bearbeitet:
Du hast im XML einen einfachen String stehen dort wird "\n" als 2 Zeichen angesehen nicht als Zeilenumbruch!

Probiere es mit
Code:
string.split("\\\n");
. Durch den doppelten "\" wird der eigentliche "\" escaped, und dann ganz normal ein "n" dahinter

Keine schlecht Idee aber die hatte ich auch schon. Weder

Code:
string.split("\\\n");

noch

Code:
string.split("\\n");
.

funktioniert. Ich kapier das ja auch nicht.

Gruß

Claus
 
Aso. Ich vergass: String#split(String) erwartet einen Regulären Ausdruck. Daher geht dort ein "\n" nicht so ohne weiteres. Wenn ich einen Split nach einem einzelnen Char mache, verpacke ich das immer RegExp-Konform in eckige Klammern: "[\n]" - et voila...
 
Du kannst den Ausdruck auch Quoten:

Java:
import java.util.regex.Pattern;

public class Test {
	
	public static void main(String[] args) {
		String test = "Test1 \\n Test2";
		String[] testsplit = test.split(Pattern.quote("\\n"));
		for(String s : testsplit) {
			System.out.println(s.trim());
		}
	}
}
 
Du kannst den Ausdruck auch Quoten:

Java:
import java.util.regex.Pattern;

public class Test {
	
	public static void main(String[] args) {
		String test = "Test1 \\n Test2";
		String[] testsplit = test.split(Pattern.quote("\\n"));
		for(String s : testsplit) {
			System.out.println(s.trim());
		}
	}
}

Da ich die XML so geliefert bekomme kann ich das leider nicht machen. Es kann doch eigentlich auch nicht so schwer sein. Joose war ja schon auf dem richtigen Weg. Die Zeichen werden wahrscheinlich gar nicht als Zeilenumbruch interpretiert. Also stehen sie intern im String wirklich so als zwei Zeichen. Man muss jetzt also eigentlich nir ein split("\n") mache. Das geht aber nicht das der \ im RegEx eine eigene Bedeutung hat. Ein Escapen des \ durch \\ bringt aber komischerweise auch nichts. Und das verstehe ich einfach nicht.

Gruß

Claus
 
Hast du jetzt meinen Lösungsansatz mit Quotation versucht? Das macht eben genau deine Zeichenfolge \n -> zu \\n und versucht mit dem zu matchen.
 
Immer noch: .split("[\n]"); funktioniert. Das verwende ich schon mehrfach so verwendet.

Sorry aber immer noch. Das funktioniert wenn im Text Zeilenumbrüche enthalten sind. Ich habe aber keinen Zeilenumbruch sondern die Zeichenkombination aus \ und n die nur einfach hintereinander stehen.

Gruß

Claus
 
Zuletzt bearbeitet:
Ach so... ja dann. Muss es unbedingt String#split() sein???

Wenn Nein, dann
Java:
StringTokenizer st = new StringTokenizer(inputString, "\\n");
while (st.hasMoreTokens()) {
	System.out.println(st.nextToken());
}
 
Übrigens hatte Flown bereits absolut recht: Ich hab es auch gerade noch mal mit dem Quote probiert und es klappt wunderbar!
Wenn ich also
Java:
		String regexp = ""+ Pattern.quote("\\n");
		String[] split = "Teil1\\nTeil2".split(regexp);
		for (String s : split) {
			System.out.println(s);
		}
mache (was ja das selbe ist, wie "Teil1\nTeil2" per Übergabeparameter aus deinem XML), dann wird es sauber erkannt.

In meinem Test-Schnipsel klappen also jetzt beide Wege mit dem eben genannten Inhalt des Übergabeparameters ("Teil1\nTeil2"):
Java:
import java.util.StringTokenizer;
import java.util.regex.Pattern;

public class SplitTest {
	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer(args[0], "\\n");
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
		String regexp = "" + Pattern.quote("\\n");
		String[] split = args[0].split(regexp);
		for (String s : split) {
			System.out.println(s);
		}
	}
}
 
Zuletzt bearbeitet:
Hi,

Asche auf mein Haupt. Ich habe den Beitrag von Flown mit dem Quoten übersehen. Das ist natürlich die richtige Lösung. Hätte ich auch selber drauf kommen könne da ich da schon einmal drauf reingefallen bin beim split(File.seperator). Das geht nämlich auch nicht ohne quoten.

Danke an alle für die Hilfe.

Gruß

Claus
 

Zurück
Oben