2 Stimmen

Text in Zeichenfolge analysieren

Ich habe einen String wie diesen :

((VIP) ODER (CHALAND)) UND ((VIP) ODER (CHALAND))

Ich muss das Wort UND extrahieren, das in 2 Abschlussklammern steht. Danach werde ich einen bedingten Test auf das Ergebnis anwenden.

Das Schwierigste ist, dass der Text zufällige Breite hat und manchmal viele Klammern hat und ich habe keine Ahnung, wie man das in Delphi-Sprache macht.


Weitere Beispiele:

(((VIP) UND (CHALAND)) UND ((VIP) ODER (CHALAND))) ODER (VIP)

Ergebnis: ODER

((((VIP) UND (CHALAND)) UND ((VIP) ODER (CHALAND))) ODER (VIP)) UND (((VIP) UND (CHALAND)) UND ((VIP) ODER (CHALAND)))

Ergebnis: UND

5voto

Marcus Adams Punkte 51234

Sie können den Text durchgehen und den Zustand verfolgen, aber wir machen hier viele Annahmen, wie zum Beispiel, dass es nur ein Wort außerhalb der Klammern gibt, die Klammer das einzige Gruppierungszeichen ist und es keine Fehler im Ausdruck gibt.

function returnUnbracketedWord(const text: String): String;
var
  i: Integer;
  bracketCount: Integer;
  currentChar: String;
begin
  Result := '';
  bracketCount := 0;
  for i := 1 to Length(text) do
  begin
    currentChar := Copy(text, i, 1);
    if currentChar = ')' then
    begin
      bracketCount := bracketCount - 1;
    end
    else if currentChar = '(' then
    begin
      bracketCount := bracketCount + 1;
    end
    else if bracketCount = 0 then
    begin
      Result := Result + currentChar;
    end;
  end;
  Result := Trim(Result);
end;

Sie könnten weitere Überprüfungen durchführen, z.B. sicherstellen, dass bracketCount = 0 am Ende ist.

5voto

TLama Punkte 73381

Wie die andere Antwort hier zählt dieser Code auch Klammern während der Zeichen-für-Zeichen-Iteration. Wenn es eine öffnende Klammer gibt, wird der interne BraceCnt-Zähler erhöht. Wenn es eine schließende Klammer gibt, wird er dekrementiert. Und wenn der Zähler 0 erreicht, bedeutet das, dass wir uns zwischen der klammerlosen Anweisung befinden, also können wir um Leerzeichen verschieben und zwei Zeichen kopieren, die der Verknüpfungsoperator sein sollten:

function GetMainConjunction(const Expression: string): string;
var
  P: PChar;
  BraceCnt: Integer;
begin
  Result := '';
  BraceCnt := 0;
  P := PChar(Expression);

  while (P^ <> #0) do
  begin
    case P^ of
      '(': Inc(BraceCnt);
      ')': Dec(BraceCnt);
    end;
    Inc(P);

    if BraceCnt = 0 then
    begin
      while (P^ = ' ') do
        Inc(P);
      SetString(Result, P, 2);
      Exit;
    end;
  end;
end;

Für diejenigen, die es hassen, ist die Zeiger-Zeichen-Iteration, die hier verwendet wird, meine Lieblingstechnik zum Parsen. Ich werde niemanden in Schnelligkeit schlagen (aber wenn du willst :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X