我正在努力处理Ansi代码字符串。我得到了[32m, [37m, [K
等字符。
是否有更快的方法从我得到的字符串中消除/去除ansi代码,而不是通过循环搜索ansi代码的起点和终点来执行此操作?
我知道声明是这样的:#27'['#x';'#y';'#z'm';
其中x,y,z ...是ANSI代码。所以我认为我应该搜索#27,直到找到“m;”
是否有任何功能可以实现我想要的功能?除this文章外,我的搜索没有返回任何内容。 感谢
答案 0 :(得分:2)
您可以使用此类代码(最简单的有限状态机)快速处理此协议:
var
s: AnsiString;
i: integer;
InColorCode: Boolean;
begin
s := 'test'#27'['#5';'#30';'#47'm colored text';
InColorCode := False;
for i := 1 to Length(s) do
if InColorCode then
case s[i] of
#0: TextAttrib = Normal;
...
#47: TextBG := White;
'm': InColorCode := false;
else;
// I do nothing here for `;`, '[' and other chars.
// treat them if necessary
end;
else
if s[i] = #27 then
InColorCode := True
else
output char with current attributes
从ESC代码中清除字符串:
procedure StripEscCode(var s: AnsiString);
const
StartChar: AnsiChar = #27;
EndChar: AnsiChar = 'm';
var
i, cnt: integer;
InEsc: Boolean;
begin
Cnt := 0;
InEsc := False;
for i := 1 to Length(s) do
if InEsc then begin
InEsc := s[i] <> EndChar;
Inc(cnt)
end
else begin
InEsc := s[i] = StartChar;
if InEsc then
Inc(cnt)
else
s[i - cnt] :=s[i];
end;
setLength(s, Length(s) - cnt);
end;