Probleme bei String replaceAll

smathedark

Mitglied
Hallo,

ich versuche innerhalb meines Programms einen Pfad zu ersetzen. Dazu habe ich ein File Objekt, von dem ich mittels getPath den Pfad erfrage. Diesen würde ich nun gerne verändern.
Leider bekomme ich immer eine java.util.regex.PatternSyntaxException.
Code:
String a="c:\\Checkout";
String b="c:\\Checkout\\Nein";
String c="c:\\Checkout\\Hallo";
b.replaceAll(a,c);

In diesem Beispiel tritt das Problem schon auf. Es muss doch Möglich sein einen Ordnernamen der zufällig mit C anfängt trozdem zu bearbeiten.

Für eure Hilfe wäre ich sehr Dankbar.
 
Der \ ist im RegEx-Ausdruck ein Steuerzeichen, daher musst du ihn mit \\ "escapen".

Code:
String a="c:\\Checkout";
a = a.replaceAll("\\\\", "\\\\");  // Ersetzt einen einzelnen \ durch einen doppelten \\
String b="c:\\Checkout\\Nein";
String c="c:\\Checkout\\Hallo";
b.replaceAll(a,c);

Ungetestet, da ich grad kein Java zur Verfügung habe.
 
Zuletzt bearbeitet:
Hallo,

bei replaceAll wird der erste String Parameter als Regex ausgewertet. Das schläft aber fehl da die Regex Engine ber der Sequenz \ gefolgt von einem Zeichen ein regex Steuerzeichen erwartet... und dein \C ist kein gültiges Regexsteuerzeichen.

du soltest dir angewähnen die entsprechende Fehlermeldung mit Stacktrace zu posten...
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 *
 */
public class ReplaceAllExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a="c:/Checkout";
        String b="c:/Checkout/Nein";
        String c="c:/Checkout/Hallo";
        System.out.println(b.replaceAll(a,c));
    }

}

so gehts auch:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 *
 */
public class ReplaceAllExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a="c:\\Checkout";
        String b="c:\\Checkout\\Nein";
        String c="c:\\Checkout\\Hallo";
        System.out.println(b.replace(a,c));
    }

}

Gruß Tom
 
Hallo,

an procurve, danke für die Idee aber dein Code erzeugt auch die Exception.
Und dir Thomas vielen Dank dein erster Vorschlag geht leider net da ich die Pfade ja mit File getPath() bekomme und dann schon die Doppelten \\ drin sind. Aber dein zweiter Vorschlag funktioniert super.

Vielen Dank.
 
Ja, hast recht. Konnte es gerade testen. Ich hab einfach ein paar \ zu wenig getippt.

Folgende Zeile ersetzt einen \ in \\:

Code:
a = a.replaceAll("\\\\", "\\\\\\\\");

Ja, ich weiß, es sieht unglaublich seltsam aus.

Erklärung: In Java sind einfache \ ein Escape-Zeichen. D.h. man muss, um im String einen einfachen \ darstellen zu können diesen durch \\ ausdrücken.
Im ersten String wird also aus \\\\ die Zeichenkette \\, die die Regex-Engine wiederum als einfachen \ interpretiert.
Für die zweite Zeichenkette erpsar ich uns die Erklärung, das sollte offensichtlich sein. ;)
 
Zurück