$ in String ersetzen fürs nochmalige ersetzen.. (JavaBug?)

thE_29

Top Contributor
Hohi!

So, mein Problem ist folgendes, ich habe einen String welcher ein paar $ enthält und diesen möchte ich in einem anderen ersetzen.

Probier ich das, kommt eine "Illegal group reference", weil die $ nicht maskiert sind..
Soweit sogut, also $ durch \$ ersetzen.

Gesagt getan, also Code hier:

Java:
String replaceWith ="HALLO$ DU BIST EIN $";
String str ="HIER WIRD ANSTATT %1 EIN TEXT REIN";
str = str.replaceAll("%1", replaceWith);

Dies führt zu der "illegal group reference"! Also gehört vorher noch der replaceWith verändert

Java:
String replaceWith ="HALLO$ DU BIST EIN $";
replaceWith = replaceWith.replaceAll("\\$", "\\\\$");
HIER KOMMT EINE: " java.lang.StringIndexOutOfBoundsException: String index out of range: 3"

Egal wielange der String ist...

Lustigerweise geht das hier ganz normal:
Java:
String replaceWith ="HALLO. DU BIST EIN .";
replaceWith = repalceWith.replaceAll("\\.", "\\\\.");

Replace arbeitet ja mit Regex und da müssen Regexzeichen halt via \ maskiert werden (und in Programmiersprachen ist meist \ = \\).

Ist das ein Java-Bug?

Habs mit Java 1.4 und mit 1.6 getestet...

Hier noch meine Testklasse:
Java:
public class Test
{
	public static void main(String args[])
	{
			String bla = "HANS_WURST_SEMAL";
			String blub = "SMS-Rufnummer:$customer.mobilePhone$";

			String blubor = "."; //Test mit .
			System.out.println(blubor);
			blubor = blubor.replaceAll("\\.", "\\\\."); //Punkt ersetzt
			System.out.println(">> " + blubor); //\. ausgabe..
			blub = blub.replaceAll("\\$", "\\\\$"); //jetzt das ganze mit $/Dollar und BADABUUUUM
			System.out.println(">> " + blub);
			bla = bla.replaceAll("WURST", blub);
			System.out.println(">> " + bla);
	}

}


mfg
 
scheint wohl bei dir irgendwas im Eimer zu sein.

Java:
	public static void main(String[] args) {
		String replaceWith = "HALLO$ DU BIST EIN $";
		System.out.println(replaceWith.replaceAll("\\$", ""));
		
		replaceWith ="HALLO$ DU BIST EIN $";
		System.out.println(replaceWith.replaceAll("\\$", "\\\\\\$")); // hier 2 \ mehr
	}

funktioniert bei mir beides.

Die StringIndexOutOfBoundsException ist allerdings etwas komisch. kommt bei mir genauso
 
Juhu! Du bist mein Held 😀
Auf nochmals 2 \ wäre ich nicht gekommen.. War grad dabei das ganze via StringBuilder zusammenzubauen..

Und warum soll bei mir was im Eimer sein? So eine ArrayIndexOufOfBoundException sollte DEFINITV nicht kommen..
Warum man das $ mehr maskieren muss als einen . (was auch ein Regex Zeichen ist) ist ja schon etwas komisch...
 
nee falsch gelesen. dachte der erste Test von meinem Beispiel, führte bei dir zu einer "Illegal group reference" aber das war ja nur ein Backslash in deinem Beispiel.

edit: damit meinte ich nicht die java.lang.StringIndexOutOfBoundsException. Die kommt ja bei mir auch und das finde ich, wie oben schon gesagt, allerdings etwas komisch..
 
\\ und $ sind Group Expressions, während . einfach nur ne Wildcard ist.

Daher fliegt die Meldung wenn du ein $ benutzt, bei . jedoch nicht.

Warum sie genau fliegt, kann ich allerdings noch nicht ganz nachvollziehen
 
Zuletzt bearbeitet:
@sonecc: Najo, das würde heißen der Fehler ist weil $ ein Boundary ist..
Es tritt aber bei ^ nicht auf...
Java:
String blubor = "^";
			System.out.println(blubor);
			blubor = blubor.replaceAll("\\^", "\\\\^");
			System.out.println(">> " + blubor);

Ausgabe:
 
Was wäre dann ein weiterer Group-Expression Ausdruck?

Edit: Ok, bei \ tritt das auch auf:

Java:
String blubor = "\\";
			System.out.println(blubor);
		
			blubor = blubor.replaceAll("\\\\", "\\\\\\");
			System.out.println(">> " + blubor);
Wenn man also "nur" \\\ schreibt, isses eines zuwenig..

Eine Patternformatexception wäre trotzdem "schöner", als eine IndexOutOfBounds 😉
 
Zuletzt bearbeitet:

Zurück
Oben