我有一个这样的字符串:
((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
答案 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迭代是我最喜欢的解析技术,我不打算以速度击败某人(但如果你想: - )