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
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报