2

我有一个这样的字符串:

((VIP) OU (CHALAND)) ET ((VIP) OU (CHALAND))

我必须提取两个词尾ET括号中的单词。在此之后,我将对结果进行条件测试。

最难的部分是文本是随机宽度,有时有很多括号,我不知道如何在 Delphi 语言中做到这一点。


更多示例:

(((VIP) ET (CHALAND)) ET ((VIP) OU (CHALAND))) OU (VIP)

结果:OU

((((VIP) ET (CHALAND)) ET ((VIP) OU (CHALAND))) OU (VIP)) ET (((VIP) ET (CHALAND)) ET ((VIP) OU (CHALAND)))

结果:ET

4

2 回答 2

5

作为此处的另一个答案,此代码还在逐字符迭代期间计算括号。如果有左括号,则内部BraceCnt计数器递增。如果有右括号,则递减。如果计数器达到 0,则意味着我们处于无括号语句之间,因此我们可以按空格移动并复制两个应该是合取运算符的字符:

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;

对于仇恨者,这里使用的指针字符迭代是我最喜欢的解析技术,我不会在速度上打败某人(但如果你想:-)

于 2013-11-05T15:40:53.687 回答
5

你可以遍历文本,跟踪状态,但是我们在这里做了很多假设,比如括号外只有一个文本单词,括号是唯一的分组字符,并且没有错误表达方式。

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;

你可以做进一步的检查,比如确保bracketCount = 0最后。

于 2013-11-05T15:23:01.163 回答