String.replaceAll Problem

Nardian

Bekanntes Mitglied
Hi Leute,

hab ein (find ich) recht merkwürdiges Problem...

Dieses mini Programm wirft mir eine Exception

Java:
String str = "test.und.gleich.noch.ein.test";
System.out.println(str.replaceAll("[.]", System.getProperty("file.separator")));

Wenn ich statt dem file.separator alle Punkte mit zb "," ersetzten möchte, gehts problemlos.. nur eben nicht mit dem Separator... Ich denke mir, da ich das nicht als "" angebe, müsste ich auch nichts escapen, weil ich es (wie ich hoffe) bereits escaped vom System bekomme... oder irre ich mich?

Weiß nich wie das auf Linux aussieht, verwende gerade Win7 mit java7, beide 64 bit.

Hat jemand eine Idee warum das nicht geht?


//Edit:
ganz vergessen, hier die Exception:

Java:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
	at java.lang.String.charAt(Unknown Source)
	at java.util.regex.Matcher.appendReplacement(Unknown Source)
	at java.util.regex.Matcher.replaceAll(Unknown Source)
	at java.lang.String.replaceAll(Unknown Source)
	at main.Main.main(Main.java:42)


//Edit2:
wohl etwas voreilig gepostet, sry...

der bug ist, dass der replacement-String auf $ und \ besonders reagiert... tolle sache... das heißt, wenn man so ein statement platform-übergreifend machen möchte, wäre wohl sowas eine lösung...

Java:
String str = "test.und.gleich.noch.ein.test";
System.out.println(str.replaceAll("[.]", System.getProperty("file.separator").replace("\\", "\\\\")));

aber schon irgendwie komisch, dass nichmal in der Javadoc steht dass eine StringIndexOutOfBounds geworfen werden kann....

naja, hat sich hiermit erledigt

MfG
 
Zuletzt bearbeitet:
Hi!

aber schon irgendwie komisch, dass nichmal in der Javadoc steht dass eine StringIndexOutOfBounds geworfen werden kann....
tatsächlich... laut JavaDoc sollte eine IndexOutOfBoundsException geworfen werden..

Du kannst in Java immer [c]/[/c] als Path Seperator nehmen, die JVM kümmert sich zur Laufzeit dann um darum, dass der richtige Seperator benutzt wird 😉
 
tatsächlich... laut JavaDoc sollte eine IndexOutOfBoundsException geworfen werden..

darf ich fragen von wo du das her hast? Ich hab sowohl in der /** javadoc (also innerhalb von Eclipse zb, der ja die javadoc aus dem code zieht), als auch unter String.replace nichts gefunden...

Du kannst in Java immer / als Path Seperator nehmen, die JVM kümmert sich zur Laufzeit dann um darum, dass der richtige Seperator benutzt wird

Hehe, danke.. ich weiß eigentlich dass das funktioniert, aber irgendwie halte ich soetwas für eher unsauber... weiß auch nicht genau warum.
 
Wieso verwendest du Regex? Du willst in einem normalen String jeden Punkt mit Fileseparator ändern, das geht auch so:
Java:
System.out.println(str.replace('.', File.separator));
oder
Java:
System.out.println(str.replace(".", String.valueOf(File.separator));

Falls du unbedingt Regex willst:
Java:
System.out.println(str.replaceAll("\\.", Pattern.quote(String.valueOf(File.separator))));
 
Danke, dachte bislang dass es nen Grund haben wird, warum es replace und replaceAll gibt.. dachte bislang dass nur replaceAll wirklich alle Vorkommen ersetzt, daher mein Regex..

Und das mit dem Pattern.quote kann ich bislang auch nich...

Gibts eigentlich nen Unterschied / "Richtlinie" oder sowas ob man nun File.separator oder über System.getProperty(...) gehn soll, oder sind die intern nicht so oder so mit einander Verlinkt?

Hehe - kurz nachgeschaut... im Win32FileSystem wird die variable slash als file.separator verwendet... Im Konstruktor der besagten Klasse:

Java:
slash = AccessController.doPrivileged(
            new GetPropertyAction("file.separator")).charAt(0);
wird also (zumindest unter Win32) keinen Unterschied machen 🙂
 
Sollte keinen geben.
Naja, an sich könnte jemand via
Code:
System.setProperty("file.separator", "ätsch");
dies manipulieren. Sicher ist also File.separator / File.separatorChar und zudem kürzer.

Übrigens fällt mir auf, dass File.separator bereits ein String ist. Du brauchst also das
Code:
String.valueOf(File.separator)
nicht!
 

Zurück
Oben