Probleme mit replaceAll Funktion

Constanzo

Mitglied
Hallo zusammen.

Ich sitze hier schon seit Stunden an einem eigentlich eher kleinen Problem, was ich einfach nicht gebacken bekomme. Wir sollen in einer Klasse prüfen, ob richtig geklammert wurde. Ein String wird also über eine Testklasse übergeben - soweit noch alles in Ordnung.

EIn typischer String ist zum Beispiel: "(2*(a+3)+b)*(a-b)+c"

Jetzt hab ich zunächst alle übrigen Zeichen entfernt, sodass nu noch die Klammern übrig bleiben.
Die replaceAll Funktion weiter unten will aber nicht funktionieren. Es kommt immer false raus.

Wäre sehr nett, wenn mir jemand hier mal weiterhelfen könnte. Dass der übrige Code nicht ganz effizient ist, soll jetzt hier keine Rolle spielen. Es geht nur um das replace Problem.

Java:
package kontrollstrukturen;

public class Text {

    String zeichenkette;
    String klammerAuf;
    String klammerZu;

    public Text(String s) {

        zeichenkette = s;
        klammerAuf = "(";
        klammerZu = ")";
    }

    public Text(String s, String klammerAuf, String klammerZu) {

        zeichenkette = s;
        this.klammerAuf = klammerAuf;
        this.klammerZu = klammerZu;
    }

    public boolean istKorrektGeklammert() {

        int primer = 0;
        int länge = zeichenkette.length() - 1;
        String result = zeichenkette;

        while (länge >= primer) {

            if ((String.valueOf(result.charAt(primer)).equals(klammerAuf))
                    || String.valueOf(result.charAt(primer)).equals(klammerZu)) {

                primer++;
            } else {

                result = result.replace(String.valueOf(zeichenkette.charAt(primer)), "\0");
                primer++;
            }
        }

//        if ((result.startsWith(klammerZu) || result.endsWith(klammerAuf))) {
//            return false;
//        }
        
        System.out.println(result);
         return process(result);
    }

    
    public boolean process(String s) {
        
        while (!s.isEmpty()) {
            String f = s;
            f = f.replaceAll("\\(\\)", "");

            if (s.equals(f)) {
                return false;
            }
            s = f;
        }
        return true;
    }
}
//    public int gibAnzahl(String s) {
//        
//    }
 
ich würde ja zwei replaceAll-Aufrufe vornehmen.

Java:
f = f.replaceAll("(", "").replaceAll(")", "");

So dürfte es funktionieren. Hab es aber nicht getestet. Ich weiß auch nicht, wofür du ein doppeltes Backslash verwendest, da diese hier keinen Sinn machen, denn die Klammer ist kein Befehl, bei dem das etwas bringt.
Meines Wissens nach.
 
Hm, wie genau soll denn die Prüfung werden ob richtig geklammert wurde?
Soll sowas wie 1(+3) auch als falsch erkannt werden? Oder gehts dir nur darum rauszufinden ob genausoviele Klammern aufgehen wie zugehen?
Dann mach einfach folgendes: Du gehst deinen String von vorne bis hinten durch und und lässt nen counter mitlaufen der die Klammern zählt. Triffst du auf ne öffnende Klammer erhöhst du den Zähler um 1, triffst du auf ne schleißende Klammer ziehst du wieder 1 ab. Die Klammerung ist korrekt wenn der Counter am Ende dann auf 0 steht und zwischenzeitlich nie negativ wurde.
 
Dass der übrige Code nicht ganz effizient ist, soll jetzt hier keine Rolle spielen.
Ich würde eher sagen: merkwürdig und evtl. sogar falsch.

Sicher, dass der String vor dem Aufruf der process Methode nur aus Klammern besteht?

Einfacher ginge es, wenn man z.B. per for Schleife über die einzelnen Zeichen des Strings iteriert bei einer öffnenden Klammer den einen Zähler erhöht bei einer schließenden Klammer den selben Zähler reduziert. Nimmt der Zähler im oder nach Schleifenverlauf einen negativen Wert ein liegt ein Fehler in der Klammerung vor.
 
Hm, wie genau soll denn die Prüfung werden ob richtig geklammert wurde?
Soll sowas wie 1(+3) auch als falsch erkannt werden? Oder gehts dir nur darum rauszufinden ob genausoviele Klammern aufgehen wie zugehen?
Dann mach einfach folgendes: Du gehst deinen String von vorne bis hinten durch und und lässt nen counter mitlaufen der die Klammern zählt. Triffst du auf ne öffnende Klammer erhöhst du den Zähler um 1, triffst du auf ne schleißende Klammer ziehst du wieder 1 ab. Die Klammerung ist korrekt wenn der Counter am Ende dann auf 0 steht und zwischenzeitlich nie negativ wurde.

Es geht tatsählich nur um die einfache Prüfung. Deine Idee ist gut. Werd ich mal ausprobieren!
 
Ich würde eher sagen: merkwürdig und evtl. sogar falsch.

Sicher, dass der String vor dem Aufruf der process Methode nur aus Klammern besteht?

Einfacher ginge es, wenn man z.B. per for Schleife über die einzelnen Zeichen des Strings iteriert bei einer öffnenden Klammer den einen Zähler erhöht bei einer schließenden Klammer den selben Zähler reduziert. Nimmt der Zähler im oder nach Schleifenverlauf einen negativen Wert ein liegt ein Fehler in der Klammerung vor.

Da war wohl jemand schneller als du 🙂
Aber meine Lösung funktioniert bis zu der process Methode ebenfalls. Der String besteht nur aus Klammern.
 
Aber meine Lösung funktioniert bis zu der process Methode ebenfalls. Der String besteht nur aus Klammern.
Vielleicht wenn man in der Zeile
Code:
result = result.replace(String.valueOf(zeichenkette.charAt(primer)), "\0");
statt dem
Code:
"\0"
Code:
"x"
schreibt und anschließend alle x durch Leerzeichen ersetzt. "\0" ist nunmal nicht nichts.
 
[c]replaceAll()[/c] verwendet Regex 😉 Es würde so oder so nicht funktionieren, da [c]1(3+)[/c] heissen würde, eine Eins und mindestens eine Drei (die Klammern mal aussen vorgelassen, die sind zum Gruppieren).
 

Zurück
Oben