解析字符串中的文本

时间:2013-11-05 14:14:32

标签: string algorithm delphi

我有一个这样的字符串:

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

我必须提取2个决赛中的单词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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

正如另一个答案,此代码还在char迭代期间计算括号中的括号。如果有左括号,则内部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;

对于仇恨者来说,这里使用的指针char迭代是我最喜欢的解析技术,我不打算以速度击败某人(但如果你想: - )