2 //**************************
3 //
\8d¡
\82Ì
\8f\8a\81A
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94 CustomStringReplace
\81@
\82¾
\82¯
\81B
4 //**************************
9 Windows, Classes, SysUtils;
11 function StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
12 function AnsiStrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
13 function ReplaceString(const S, OldPattern, NewPattern: string): string;
15 function CustomStringReplace(S , OldPattern: String;const NewPattern: string): String; overload;
16 function CustomStringReplace(S , OldPattern: String;const NewPattern: string; IgnoreCase : Boolean): String; overload;
17 procedure CustomStringReplace(var S : TStringList; OldPattern: String;const NewPattern: string);overload;
18 procedure CustomStringReplace(var S : TStringList; OldPattern: String;const NewPattern: string; IgnoreCase : Boolean);overload;
23 function CustomStringReplace(
24 S ,OldPattern: String;
25 const NewPattern: string
30 lenOld : Integer;//OldPattern
\82Ì
\92·
\82³
33 Result := ReplaceString(S,OldPattern,NewPattern);
36 lenOld := Length(OldPattern);
38 position := AnsiPos( OldPattern, S);
39 while position <> 0 do begin
40 Result := Result + Copy(S,1,position -1 ) + NewPattern;
41 Delete(S,1, position + lenOld - 1);
42 position := AnsiPos( OldPattern, S);
44 if Length( S ) > 0 then begin
50 function CustomStringReplace(
51 S , OldPattern: String;
52 const NewPattern: string;
57 lenOld : Integer;//OldPattern
\82Ì
\92·
\82³
61 lenOld := Length(OldPattern);
63 if not IgnoreCase then begin
64 Result := ReplaceString(S,OldPattern,NewPattern);
66 buffer := AnsiLowerCase(S);
67 OldPattern := AnsiLowerCase(OldPattern);
68 position := AnsiPos( OldPattern, buffer);
69 while position <> 0 do begin
70 Result := Result + Copy(S,1,position -1 ) + NewPattern;
71 Delete(S,1, position + lenOld - 1);
72 Delete(buffer,1, position + lenOld - 1);
73 position := AnsiPos( OldPattern, buffer);
75 if Length( S ) > 0 then begin
80 procedure CustomStringReplace(
83 const NewPattern: string;
89 if not IgnoreCase then begin
90 for i := 0 to S.Count - 1 do begin
91 S.Strings[i] := ReplaceString(S.Strings[i],OldPattern,NewPattern);
94 for i := 0 to S.Count - 1 do begin
95 S.Strings[i] := CustomStringReplace( S.Strings[i], OldPattern, NewPattern,IgnoreCase );
99 procedure CustomStringReplace(
102 const NewPattern: string
107 for i := 0 to S.Count - 1 do begin
108 S.Strings[i] := ReplaceString(S.Strings[i],OldPattern,NewPattern);
112 function StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
118 MOV ESI,ECX { Point ESI to substr }
119 MOV EDI,EAX { Point EDI to s }
121 MOV ECX,EDX { ECX = search length }
127 DEC EDX { EDX = Length(substr) - 1 }
128 JS @@fail { < 0 ? return 0 }
129 MOV AL,[ESI] { AL = first char of substr }
130 INC ESI { Point ESI to 2'nd char of substr }
132 SUB ECX,EDX { #positions in s to look at }
133 { = Length(s) - Length(substr) + 1 }
138 MOV EBX,ECX { save outer loop counter }
139 PUSH ESI { save outer loop substr pointer }
140 PUSH EDI { save outer loop s pointer }
144 POP EDI { restore outer loop s pointer }
145 POP ESI { restore outer loop substr pointer }
147 MOV ECX,EBX { restore outer loop counter }
155 MOV EAX,EDI { EDI points of char after match }
163 function AnsiStrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
166 ByteType : TMbcsByteType;
169 if (StrStart = nil) or (StrStart^ = #0) or
170 (SubstrStart = nil) or (SubstrStart^ = #0) then Exit;
171 L2 := SubstrEnd - SubstrStart;
172 Result := StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd);
173 while (Result <> nil) and (StrEnd - Result >= L2) do begin
174 ByteType := StrByteType(StrStart, Integer(Result-StrStart));
175 if (ByteType <> mbTrailByte) and
176 (CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT, Result, L2, SubstrStart, L2) = 2)
178 if (ByteType = mbLeadByte) then Inc(Result);
180 Result := StrPosEx(Result, StrEnd, SubStrStart, SubStrEnd);
185 function ReplaceString(const S, OldPattern, NewPattern: string): string;
187 ReplaceCount: Integer;
194 if OldPattern = '' then Exit;
197 ps := PChar(OldPattern);
198 pe := ps + Length(OldPattern);
201 p := AnsiStrPosEx(p, e, ps, pe);
202 if p = nil then Break;
204 Inc(p, Length(OldPattern));
206 if ReplaceCount = 0 then Exit;
207 SetString(Result, nil, Length(S) +
208 (Length(NewPattern) - Length(OldPattern)) * ReplaceCount);
211 for i := 0 to ReplaceCount - 1 do begin
212 Count := AnsiStrPosEx(p, e, ps, pe) - p;
213 Move(p^, Result[DestIndex], Count);
214 Inc(p, Count);//p := pp;
215 Inc(DestIndex, Count);
216 Move(NewPattern[1], Result[DestIndex], Length(NewPattern));
217 Inc(p, Length(OldPattern));
218 Inc(DestIndex, Length(NewPattern));
220 Move(p^, Result[DestIndex], e - p);