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

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

原型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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 //结束长度(要删除的字符数) 

示例:

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

  

 

 

创建时间:2022.07.07

posted on   滔Roy  阅读(1084)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报

导航

点击右上角即可分享
微信分享提示