Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mit pos ein sich wiederholendes Zeichen finden


wayne123 - Mo 17.10.11 19:53
Titel: Mit pos ein sich wiederholendes Zeichen finden
Also, ich möchte, wenn ich zb. im Edit-Feld (x(yx)y) stehen habe, mit pos oder einer nicht allzu schweren Alternative die die Stelle, an der die letzte öffnende Klammer '(' steht herausfinden. Die dazugehörige Klammer müsste von dieser aus ja eig. immer die dazugehörige Klammer sein, wodurch ich diese ausrechnen kann, die Klammer durch das Ergebnis ersetzen kann und das ganze dann wieder von vorne beginnen kann. Nur wie soll ich die letzte Klammer finden, denn Pos sagt mir ja nur die Stelle, wo die erste ist und alle durchzugehen ist ja zu aufwendig.


Niko S. - Mo 17.10.11 20:00

hm.. Also entweder schaust du Zeichen für Zeichen von hinten durch. Oder mit PosEx.
Der Funktion kannste einen start-wert geben, ab wo sie suchen soll.


Jann1k - Mo 17.10.11 20:04

Du kannst den String auch einfach einmal umdrehen und dann mit Pos arbeiten.


wayne123 - Mo 17.10.11 20:17

user profile iconJann1k hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst den String auch einfach einmal umdrehen und dann mit Pos arbeiten.


Wie kann man denn den String umdrehen? Und wenn, dann hab ich ja eine verfälschte Stelle für die erste Klammer.


rushifell - Mo 17.10.11 20:42

Hallo, wenn ich das richtig verstehe, möchtest Du im Grunde wissen, an welcher Position sich die Klammer (yx) befindet?

Ich würde das folgendermaßen machen. Mit einer For-Schleife nach der schließenden Klammer suchen, also ")". Vielleicht ungefähr so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Var i:Integer;
    ka,kz:Integer; //Klammer auf, Klammer zu
    S:String;
begin
ka:=-1;
kz:=-1;
For i:=1 to Length(S) do
    BEGIN
     IF S[i]='(' then ka:=i;
     IF S[i]=')' then kz:=i;
     IF kz<>-1 then break; //Klammer zu wurde gefunden
    END;
end;


wayne123 - Mo 17.10.11 20:58

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Ahh, okay, das Beispiel war doof gewählt, denn es sollte nämlich auch in dem Fall'((xy)x)y(yx)' die letzte Klammer finden und das würde ja hier(glaub ich) nicht funktionieren. Oder würde es so funktionieren, dass bei einer Rechnung immer eine Klammer entnommen wird, die keine weitere Klammer enthält?


rushifell - Mo 17.10.11 21:08

Also, ich weiss ja nicht, was Du genau vorhast, aber in Deinem Beispiel werden die Klammer in folgender Reihenfolge aufgelöst:
((xy)x)y(yx)
((xy)x)y(yx)
((xy)x)y(yx)

Wenn Du wirklich die letzte Klammer zuerst finden willst, musste Du den String, wie schon oben vorgeschlagen, von hinten nach vorne durchsuchen:

Delphi-Quelltext
1:
2:
For i:=Length(S) downto 1 do
    ...


wayne123 - Mo 17.10.11 21:19

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

So in der Art wollt ichs auch zuerst machen, aber dein Weg erscheint mir doch viel sinvoller als immer hinten anzufangen, obwohl man das ja garnicht muss. Danke dafür.


Jann1k - Mo 17.10.11 22:07

Zitat:
Wie kann man denn den String umdrehen? Und wenn, dann hab ich ja eine verfälschte Stelle für die erste Klammer.


Die Funktion StringReverse in StrUtils dreht dir einen String um. Den Index kannst du ja einfach anpassen (Länge - falscher index + 1 = richtiger index).


jasocul - Di 18.10.11 07:11

Wie wäre es mit einer rekursiven Funktion?
Für mich schreit das geradezu danach. Aber ist natürlich Geschmackssache. :wink: