Ich möchte jetzt nicht speziell auf Deinen Code eingehen, sondern sondern generelle Fallstricke aufzeigen, welche so ziemlich alle "scheinbar" funktionierende Lösungen zu Fall bringen können.
Das Netz ist voll von recht guten Ansätzen, welche im Idealfall recht gut funktionieren::
- https://www.google.com/search?q=java+balanced+brackets+in+string
- https://www.baeldung.com/java-balanced-brackets-algorithm
Aber da gibts Murphys Gesetz und da ist nichts Ideal. es kommt auch auf den zu untersuchenden Text/Code an. Je nach Sprache des zu untersuchenden Codes muss man Kommentare , Stringdeklarationen ausschließen
Hier einfach mal ein ganz fieses Beispiel eine zu untersuchenden Powershellcodes: (der dir jeden simplen "Zähler" um die Ohren fliegen lässt)
$ESC = [char]0x1b
for ($red=0; $red -le 1000; $red+=10 ){
#ANSI-Escapesequenzen sind schon besonders :)
"$ESC[48;2;$(($red+3)%255);2;0;38;2;128;255;0mIch bin mit RGB-Sequenzen gefaerbt :) Rotanteil:""$(($red+3)%255)""$ESC[0m"
}
Die Klammern sind tatsächlich ausgeglichen. Algoritmus müsste allerdings #Kommentartext , 'Literal' und "Stringdeklaration" ausschließen. Aber jetzt kommt es noch dicker... innerhalb der Stringdeklaration habe ich auch Laufzeitfunktionen deklariert $(Functionexecution), welche im Extremfall auch ihrerseits ineinander verschachtelte Klammen enthalten könnten. die müsste dann wieder berücksichtigt werden 🤮 Ich hab nur mal Powershellcode als Text gewählt um die Sache auf die Spitze zu treiben.
Auch zu untersuchende Texte in andern Programmiersprachen enthalten Kommentare und andere Konstrukte, welche einen primitiven (Zähl)Algorithmus aus den Tritt bringen würden:.
Java
/* lass uns über schließende Klammerzeichen:
)]}>
reden*/
System.out.println("Hallo Textsmilie :)"); // Kommentar :)
Javascript (RegEx-Pattern werden nicht als "String" deklariert! ---ganz böse Falle---)
let text = "Ein Smilie :)";
let result = text.match(/:\)/i);
...spätestens an diesem Punkt würde ein simpler Zähler/Stack aus dem tritt kommen
Ich weiß nicht was Du letztlich vorhast und wie universell ensetzbar Dein Algorithmus sein soll?ich wollte Dir lediglich aufzeigen, dass es nicht einfach genügt die Klammern Hoch und Runter zu zählen. Je nach Sprache musst Du auch noch unterscheiden was funktionale Klammen sind und welche Klammern uninteressant sind.