Delphi XE 3-从字符串中删除Ansi代码/颜色

0dxa2lsx  于 2023-03-29  发布在  其他
关注(0)|答案(1)|浏览(105)

我在处理ANSI代码字符串时遇到了麻烦。我得到了[32m, [37m, [K等字符。
有没有更快的方法来消除/剥离ansi代码从字符串我得到,而不是这样做的循环通过字符搜索的开始和结束点的ansi代码?
我知道宣言是这样的:#27'['#x';'#y';'#z'm';其中x,y,z...是ANSI代码。所以我假设我应该搜索#27,直到我找到“m;”
有没有已经做好的函数来实现我想要的?我的搜索除了this文章外什么也没有返回。谢谢

ny6fqffe

ny6fqffe1#

你可以用这样的代码(最简单的有限状态机)非常快速地处理这个协议:

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;

相关问题