2 //******************************************************************************
3 //
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94 CustomStringReplace
4 //
\8eg
\82¢
\95û
\82Í
\81A
5 //
\81@CustomStringReplace(
6 //
\81@
\8c³
\82Ì
\95¶
\8e\9a\97ñ
\81iString
\82à
\82µ
\82
\82ÍTStringList),
7 //
\81@
\8c\9f\8dõ
\95¶
\8e\9a\97ñ
\81iString),
8 //
\92u
\8a·
\95¶
\8e\9a\97ñ
\81iString),
9 //
\91å
\95¶
\8e\9a\8f¬
\95¶
\8e\9a\81iBoolean)True:
\8bæ
\95Ê
\82µ
\82È
\82¢
\81@false or
\8fÈ
\97ª:
\8bæ
\95Ê
\82·
\82é
11 // Delphi-ML
\82Ì
\8bL
\8e\9669334
\82É
\8dÚ
\82Á
\82Ä
\82¢
\82½
\83R
\81[
\83h
\82ð
\8aÛ
\83p
\83N
\83\8a\82µ
\82Ü
\82µ
\82½
\81B
12 //******************************************************************************
17 Windows, Classes, SysUtils;
19 function StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
20 function AnsiStrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
21 function ReplaceString(const S, OldPattern, NewPattern: string): string;
22 function IgnoCaseReplaceString(const S, OldPattern, NewPattern: string): string;
24 function CustomStringReplace(S , OldPattern: String;const NewPattern: string): String; overload;
25 function CustomStringReplace(S , OldPattern: String;const NewPattern: string; IgnoreCase : Boolean): String; overload;
26 procedure CustomStringReplace(var S : TStringList; OldPattern: String;const NewPattern: string);overload;
27 procedure CustomStringReplace(var S : TStringList; OldPattern: String;const NewPattern: string; IgnoreCase : Boolean);overload;
29 function ZenToHan(const s: string): string;
30 function VaguePos(const Substr, S: string): Integer;
33 //
\83|
\83C
\83\93\83^
\81[
\81\95\83A
\83Z
\83\93\83u
\83\89\82É
\82æ
\82é
\8d\82\91¬
\83|
\83X
34 function StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
40 MOV ESI,ECX { Point ESI to substr }
41 MOV EDI,EAX { Point EDI to s }
43 MOV ECX,EDX { ECX = search length }
49 DEC EDX { EDX = Length(substr) - 1 }
50 JS @@fail { < 0 ? return 0 }
51 MOV AL,[ESI] { AL = first char of substr }
52 INC ESI { Point ESI to 2'nd char of substr }
54 SUB ECX,EDX { #positions in s to look at }
55 { = Length(s) - Length(substr) + 1 }
60 MOV EBX,ECX { save outer loop counter }
61 PUSH ESI { save outer loop substr pointer }
62 PUSH EDI { save outer loop s pointer }
66 POP EDI { restore outer loop s pointer }
67 POP ESI { restore outer loop substr pointer }
69 MOV ECX,EBX { restore outer loop counter }
77 MOV EAX,EDI { EDI points of char after match }
84 //
\81@AnsiPos
\82Ì
\8d\82\91¬
\94Å
85 function AnsiStrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd: PChar): PChar;
88 ByteType : TMbcsByteType;
91 if (StrStart = nil) or (StrStart^ = #0) or
92 (SubstrStart = nil) or (SubstrStart^ = #0) then Exit;
94 L2 := SubstrEnd - SubstrStart;
95 Result := StrPosEx(StrStart, StrEnd, SubstrStart, SubstrEnd);
97 while (Result <> nil) and (StrEnd - Result >= L2) do begin
98 ByteType := StrByteType(StrStart, Integer(Result-StrStart));
99 if (ByteType <> mbTrailByte) and
100 (CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT, Result, L2, SubstrStart, L2) = 2)
102 if (ByteType = mbLeadByte) then Inc(Result);
104 Result := StrPosEx(Result, StrEnd, SubStrStart, SubStrEnd);
110 //
\8d\82\91¬
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94\81i
\91å
\95¶
\8e\9a\8f¬
\95¶
\8e\9a\82Ì
\88á
\82¢
\82ð
\96³
\8e\8b\82µ
\82È
\82¢
\81j
111 function ReplaceString(const S, OldPattern, NewPattern: string): string;
113 ReplaceCount: Integer;
120 if OldPattern = '' then Exit;
123 ps := PChar(OldPattern);
124 pe := ps + Length(OldPattern);
127 p := AnsiStrPosEx(p, e, ps, pe);
128 if p = nil then Break;
130 Inc(p, Length(OldPattern));
132 if ReplaceCount = 0 then Exit;
133 SetString(Result, nil, Length(S) +
134 (Length(NewPattern) - Length(OldPattern)) * ReplaceCount);
137 l := Length( NewPattern );
138 for i := 0 to ReplaceCount - 1 do begin
139 Count := AnsiStrPosEx(p, e, ps, pe) - p;
140 Move(p^, Result[DestIndex], Count);
141 Inc(p, Count);//p := pp;
142 Inc(DestIndex, Count);
143 Move(NewPattern[1], Result[DestIndex], l);
144 Inc(p, Length(OldPattern));
147 Move(p^, Result[DestIndex], e - p);
149 //
\8d\82\91¬
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94\81i
\91å
\95¶
\8e\9a\8f¬
\95¶
\8e\9a\82Ì
\88á
\82¢
\82ð
\96³
\8e\8b\82·
\82é
\81j
150 function IgnoCaseReplaceString(const S, OldPattern, NewPattern: string): string;
152 ReplaceCount: Integer;
155 p, e{, ps, pe}: PChar;
156 p2, e2, ps2, pe2: PChar;
159 bufferOldPattern : String;
162 bufferS := AnsiLowerCase(S);
163 bufferOldPattern := AnsiLowerCase(OldPattern);
165 if OldPattern = '' then Exit;
167 p2 := PChar(bufferS);
169 e2 := p2 + Length(bufferS);
170 //ps := PChar(OldPattern);
171 ps2 := PChar(bufferOldPattern);
172 //pe := ps + Length(OldPattern);
173 pe2 := ps2 + Length(bufferOldPattern);
176 while p2 < e2 do begin
177 p2 := AnsiStrPosEx(p2, e2, ps2, pe2);
178 if p2 = nil then Break;
180 Inc(p2, Length(bufferOldPattern));
182 if ReplaceCount = 0 then Exit;
183 SetString(Result, nil, Length(bufferS) +
184 (Length(NewPattern) - Length(bufferOldPattern)) * ReplaceCount);
185 p2 := PChar(bufferS);
187 l := Length( NewPattern );
188 for i := 0 to ReplaceCount - 1 do begin
189 Count := AnsiStrPosEx(p2, e2, ps2, pe2) - p2;
190 Move(p^, Result[DestIndex], Count);
191 Inc(p, Count);//p := pp;
192 Inc(p2, Count);//p := pp;
193 Inc(DestIndex, Count);
194 Move(NewPattern[1], Result[DestIndex], l);
195 Inc(p, Length(OldPattern));
196 Inc(p2, Length(OldPattern));
199 Move(p^, Result[DestIndex], e - p);
205 //
\8d\82\91¬
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94\81i
\83v
\83\8a\83~
\83e
\83B
\83u
\81j
206 function CustomStringReplace(
207 S ,OldPattern: String;
208 const NewPattern: string
212 Result := ReplaceString(S,OldPattern,NewPattern);
215 //
\8d\82\91¬
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94\81i
\94Ä
\97p
\94Å
\82P
\81j
216 function CustomStringReplace(
217 S , OldPattern: String;
218 const NewPattern: string;
223 if not IgnoreCase then begin
224 Result := ReplaceString(S,OldPattern,NewPattern);
226 Result := IgnoCaseReplaceString(S,OldPattern,NewPattern);
230 //
\8d\82\91¬
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94\81i
\94Ä
\97p
\94Å
\82Q
\81j
231 procedure CustomStringReplace(
234 const NewPattern: string;
241 if not IgnoreCase then begin
242 for i := 0 to S.Count - 1 do begin
243 S.Strings[i] := ReplaceString(S.Strings[i], OldPattern,NewPattern);
246 for i := 0 to S.Count - 1 do begin
247 S.Strings[i] := IgnoCaseReplaceString(S.Strings[i], OldPattern,NewPattern);
253 //
\8d\82\91¬
\95¶
\8e\9a\97ñ
\92u
\8a·
\8aÖ
\90\94\81i
\94Ä
\97p
\94Å
\82R
\81j
254 procedure CustomStringReplace(
257 const NewPattern: string
263 for i := 0 to S.Count - 1 do begin
264 S.Strings[i] := ReplaceString(S.Strings[i], OldPattern,NewPattern);;
269 (*************************************************************************
270 *
\91S
\8ap
\81¨
\94¼
\8ap
272 *************************************************************************)
273 function ZenToHan(const s: string): string;
275 //Chr: array [0..1024] of char;
279 SetLength(Chr, Length(s));
280 ChrLen := Windows.LCMapString(
281 GetUserDefaultLCID(),
283 LCMAP_HALFWIDTH or LCMAP_KATAKANA or LCMAP_LOWERCASE,
289 Result := Copy(Chr, 1, ChrLen);
292 (*************************************************************************
293 *
\91S
\8ap
\94¼
\8ap
\82Ð
\82ç
\82ª
\82È
\82©
\82½
\82©
\82È
\82ð
\8bæ
\95Ê
\82µ
\82È
\82¢
\90¦
\82¢Pos
294 *************************************************************************)
295 function VaguePos(const Substr, S: string): Integer;
297 Result := AnsiPos(ZenToHan(Substr), ZenToHan(S));