• Delphi System.Delete 从字符串中删除指定的字符


    Delphi System.Delete - 从字符串中删除指定的字符

    原型:

    procedure   _Delete{ var s : openstring; index, count : Integer };
    asm
    {     ->EAX     Pointer to s    }
    {       EDX     index           }
    {       ECX     count           }
    
            PUSH    ESI
            PUSH    EDI
    
            MOV     EDI,EAX
    
            XOR     EAX,EAX
            MOV     AL,[EDI]
    
    {      如果index不在[1..Length(s)]中,则不执行任何操作    }
    
            TEST    EDX,EDX
            JLE     @@exit
            CMP     EDX,EAX
            JG      @@exit
    
    {       将计数限制为[0..Length(s)-index+1]     }
    
            TEST    ECX,ECX
            JLE     @@exit
            SUB     EAX,EDX         { 计算长度-index+1       }
            INC     EAX
            CMP     ECX,EAX
            JLE     @@1
            MOV     ECX,EAX
    @@1:
            SUB     [EDI],CL        { 按计数减少长度                   }
            ADD     EDI,EDX         {将EDI指向要删除的第一个字符 }
            LEA     ESI,[EDI+ECX]   { 将ESI指向要保留的第一个字符      }
            SUB     EAX,ECX         { #字符=长度(s)-索引+1-计数       }
            MOV     ECX,EAX
    
            REP     MOVSB
    
    @@exit:
            POP     EDI
            POP     ESI
    end;
    
    procedure       _LStrDelete{ var s : AnsiString; index, count : Integer };
    asm
            {     ->EAX     Pointer to s    }
            {       EDX     index           }
            {       ECX     count           }
    
            PUSH    EBX
            PUSH    ESI
            PUSH    EDI
    
            MOV     EBX,EAX
            MOV     ESI,EDX
            MOV     EDI,ECX
    
            CALL    UniqueString
    
            MOV     EDX,[EBX]
            TEST    EDX,EDX         { source already empty: nothing to do   }
            JE      @@exit
    
            MOV     ECX,[EDX-skew].StrRec.length
    
    {       make index 0-based, if not in [0 .. Length(s)-1] do nothing     }
    
            DEC     ESI
            JL      @@exit
            CMP     ESI,ECX
            JGE     @@exit
    
    {       limit count to [0 .. Length(s) - index] }
    
            TEST    EDI,EDI
            JLE     @@exit
            SUB     ECX,ESI         { ECX = Length(s) - index       }
            CMP     EDI,ECX
            JLE     @@1
            MOV     EDI,ECX
    @@1:
    
    {       move length - index - count characters from s+index+count to s+index }
    
            SUB     ECX,EDI         { ECX = Length(s) - index - count       }
            ADD     EDX,ESI         { EDX = s+index                 }
            LEA     EAX,[EDX+EDI]   { EAX = s+index+count           }
            CALL    Move
    
    {       set length(s) to length(s) - count      }
    
            MOV     EDX,[EBX]
            MOV     EAX,EBX
            MOV     EDX,[EDX-skew].StrRec.length
            SUB     EDX,EDI
            CALL    _LStrSetLength
    
    @@exit:
            POP     EDI
            POP     ESI
            POP     EBX
    end;
    
    procedure _WStrDelete(var S: WideString; Index, Count: Integer);
    var
      L, N: Integer;
      NewStr: PWideChar;
    begin
      L := Length(S);
      if (L > 0) and (Index >= 1) and (Index <= L) and (Count > 0) then
      begin
        Dec(Index);
        N := L - Index - Count;
        if N < 0 then N := 0;
        if (Index = 0) and (N = 0) then NewStr := nil else
        begin
          NewStr := _NewWideString(Index + N);
          if Index > 0 then
            Move(Pointer(S)^, NewStr^, Index * 2);
          if N > 0 then
            Move(PWideChar(Pointer(S))[L - N], NewStr[Index], N * 2);
        end;
        WStrSet(S, NewStr);
      end;
    end;
    

    参数说明:

    • s   //要处理的源字符串
    • index   //起始位置;  起始位置不能小于 1
    • count //结束长度(要删除的字符数) 

    示例:

    var
      sStr: string;
    begin
      sStr := 'TaoRoy 2022';
      Delete(sStr, 7, 5);
      ShowMessage(sStr); {TaoRoy}
    end;
    

      

    创建时间:2022.07.07

  • 相关阅读:
    golang的server push
    go context学习
    go struct{} 空结构体的特点和作用
    Java基本语法--关键字&标识符
    初识Java
    Dos常用命令
    Markdown进阶教程
    Markdown基础教程
    Navicat Premium15安装与激活
    JDK的安装与环境配置(Windows10)
  • 原文地址:https://www.cnblogs.com/guorongtao/p/16453362.html
Copyright © 2020-2023  润新知