1 uses RegularExpressions; //相关单元
2
3 const
4 pattern = '[A-Z]+d+'; //测试用的表达式
5 txt = 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA'; //测试用的目标文本
6
7 {是否匹配成功}
8 procedure TForm1.Button1Click(Sender: TObject);
9 begin
10 if TRegEx.IsMatch(txt, pattern) then
11 begin
12 ShowMessage('有匹配到');
13 end;
14 end;
15
16 {获取第一个匹配结果}
17 procedure TForm1.Button2Click(Sender: TObject);
18 var
19 match: TMatch;
20 begin
21 match := TRegEx.Match(txt, pattern);
22 if match.Success then //或用一句话 if TRegEx.Match(txt, pattern).Success then
23 begin
24 ShowMessage(match.Value); //AAA1
25 end;
26 end;
27
28 {获取所有匹配结果}
29 procedure TForm1.Button3Click(Sender: TObject);
30 var
31 matchs: TMatchCollection;
32 match: TMatch;
33 i: Integer;
34 begin
35 matchs := TRegEx.Matches(txt, pattern);
36
37 Memo1.Clear;
38 for match in matchs do
39 begin
40 Memo1.Lines.Add(match.Value);
41 end;
42
43 Memo1.Lines.Add('----------');
44 for i := 0 to matchs.Count - 1 do
45 begin
46 Memo1.Lines.Add(matchs[i].Value);
47 end;
48 end;
49
50 {使用 TMatch 对象的 NextMatch 遍历匹配结果时,需实例化对象}
51 procedure TForm1.Button4Click(Sender: TObject);
52 var
53 reg: TRegEx;
54 match: TMatch;
55 begin
56 reg := TRegEx.Create(pattern);
57 match := reg.Match(txt);
58
59 Memo1.Clear;
60 while match.Success do
61 begin
62 Memo1.Lines.Add(match.Value);
63 match := match.NextMatch;
64 end;
65 end;
66
67 {替换}
68 procedure TForm1.Button6Click(Sender: TObject);
69 begin
70 Memo1.Text := TRegEx.Replace(txt, pattern, 'xxx'); //xxx xxx xxx xxx xxx xxx AAAA
71 end;
72
73 {分割}
74 procedure TForm1.Button7Click(Sender: TObject);
75 var
76 rArr: TArray<string>;
77 s: string;
78 begin
79 rArr := TRegEx.Split('AAA,BBB;CCC,DDD EEE', '[,; ]');
80
81 Memo1.Clear;
82 for s in rArr do
83 begin
84 Memo1.Lines.Add(s); //AAA/BBB/CCC/DDD/EEE
85 end;
86 end;
87
88 {TRegEx 还有一个 class 方法 Escape, 用于给特殊字符转义}
89 procedure TForm1.Button8Click(Sender: TObject);
90 begin
91 Memo1.Text := TRegEx.Escape('[]^$.|?*+(){}'); //: \[]^$.|?*+(){}
92 end;
93
94 uses RegularExpressions;
95
96 const
97 pattern = '([A-Z]+)(d+)'; //其三个子表达式分别是:[A-Z]+d+ [A-Z]+ d+
98 txt = 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA'; //测试用的目标文本
99
100 procedure TForm1.Button1Click(Sender: TObject);
101 var
102 match: TMatch;
103 group: TGroup;
104 groups: TGroupCollection;
105 begin
106 match := TRegEx.Match(txt, pattern);
107 groups := match.Groups;
108
109 Memo1.Clear;
110 for group in groups do
111 begin
112 Memo1.Lines.Add(group.Value); //AAA1/AAA/1
113 end;
114 end;
115
116 procedure TForm1.Button2Click(Sender: TObject);
117 var
118 match: TMatch;
119 group: TGroup;
120 begin
121 Memo1.Clear;
122 for match in TRegEx.Matches(txt, pattern) do
123 begin
124 for group in match.Groups do
125 begin
126 Memo1.Lines.Add(group.Value);
127 end;
128 Memo1.Lines.Add('');
129 end;
130 end;
131 {**************
132 AA11
133 AA
134 11
135
136 BB22
137 BB
138 22
139
140 A111
141 A
142 111
143
144 B222
145 B
146 222
147 **************}
148
149 procedure TForm1.Button3Click(Sender: TObject);
150 var
151 rStr: string;
152 begin
153 Memo1.Clear;
154 rStr := TRegEx.Replace(txt, pattern, '$1'); //AAA BBB AA BB A B AAAA
155 Memo1.Lines.Add(rStr);
156
157 rStr := TRegEx.Replace(txt, pattern, '$2'); //1 2 11 22 111 222 AAAA
158 Memo1.Lines.Add(rStr);
159
160 rStr := TRegEx.Replace(txt, pattern, '$2$1'); //1AAA 2BBB 11AA 22BB 111A 222B AAAA
161 Memo1.Lines.Add(rStr);
162 end;
163 {**********************************
164 AAA BBB AA BB A B AAAA
165 1 2 11 22 111 222 AAAA
166 1AAA 2BBB 11AA 22BB 111A 222B AAAA
167 ***********************************}
168
169
170 unit Unit1;
171
172 interface
173
174 uses
175 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
176 Dialogs, StdCtrls, RegularExpressions;
177
178 type
179 TForm1 = class(TForm)
180 Memo1: TMemo;
181 Button1: TButton;
182 procedure Button1Click(Sender: TObject);
183 private
184 function MyMatchEvaluator(const Match: TMatch): string; //TMatchEvaluator = function(const Match: TMatch): string of object;
185 public
186 end;
187
188 var
189 Form1: TForm1;
190
191 implementation
192
193 {$R *.dfm}
194
195 const
196 pattern = '[A-Z]+d+';
197 txt = 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';
198
199 procedure TForm1.Button1Click(Sender: TObject);
200 begin
201 Memo1.Text := TRegEx.Replace(txt, pattern, MyMatchEvaluator); //aaa1 bbb2 aa11 bb22 a111 b222 AAAA
202 end;
203
204 function TForm1.MyMatchEvaluator(const Match: TMatch): string;
205 begin
206 Result := LowerCase(Match.Value);
207 end;
208
209 end.
210
211
212 TRegExOption = (
213 roNone, //无
214 roIgnoreCase, //不区分大小写
215 roMultiLine, //多行模式; 可使 ^ 和 $ 匹配每个行首或行尾
216 roExplicitCapture, //只捕获指定了名称或编号的子表达式
217 roCompiled, //预编译表达式; 这在反复使用更有效率
218 roSingleLine, //单行模式; 使 . 也可匹配换行符
219 roIgnorePatternSpace //忽略注释和未经转义的空白
220 );
221
222 uses RegularExpressions;
223
224 {roIgnoreCase}
225 procedure TForm1.Button1Click(Sender: TObject);
226 const
227 pattern = '[A-Z]+d+';
228 txt = 'AAA1 bbb2 aa11 bb22 A111 B222 AAAA';
229 var
230 match: TMatch;
231 begin
232 Memo1.Clear;
233 for match in TRegEx.Matches(txt, pattern, [roIgnoreCase]) do
234 begin
235 Memo1.Lines.Add(match.Value);
236 end;
237
238 Memo1.Lines.Add('----------');
239
240 for match in TRegEx.Matches(txt, pattern) do
241 begin
242 Memo1.Lines.Add(match.Value);
243 end;
244 end;
245 {*********************
246 AAA1
247 bbb2
248 aa11
249 bb22
250 A111
251 B222
252 ----------
253 AAA1
254 A111
255 B222
256 **********************}
257
258 {roMultiLine}
259 procedure TForm1.Button2Click(Sender: TObject);
260 const
261 txt = 'Delphi Delphi Delphi'#13#10'Delphi Delphi Delphi';
262 var
263 rStr: string;
264 begin
265 Memo1.Clear;
266 {行首}
267 rStr := TRegEx.Replace(txt, '^Delphi', '......', [roMultiLine]);
268 Memo1.Lines.Add(rStr);
269 Memo1.Lines.Add('--------------------');
270 rStr := TRegEx.Replace(txt, '^Delphi', '......');
271 Memo1.Lines.Add(rStr);
272
273 Memo1.Lines.Add('--------------------');
274 {行尾}
275 rStr := TRegEx.Replace(txt, 'Delphi$', '......', [roMultiLine]);
276 Memo1.Lines.Add(rStr);
277 Memo1.Lines.Add('--------------------');
278 rStr := TRegEx.Replace(txt, 'Delphi$', '......');
279 Memo1.Lines.Add(rStr);
280 end;
281 {*********************
282 ...... Delphi Delphi
283 ...... Delphi Delphi
284 --------------------
285 ...... Delphi Delphi
286 Delphi Delphi Delphi
287 --------------------
288 Delphi Delphi ......
289 Delphi Delphi ......
290 --------------------
291 Delphi Delphi Delphi
292 Delphi Delphi ......
293 **********************}
294
295 {roExplicitCapture}
296 procedure TForm1.Button3Click(Sender: TObject);
297 const
298 pattern1 = '([A-Z]+)(d+)';
299 pattern2 = '(?<name1>[A-Z]+)(d+)';
300 pattern3 = '([A-Z]+)(?<3>d+)';
301 txt = 'AA11 BB22';
302 var
303 match: TMatch;
304 group: TGroup;
305 begin
306 Memo1.Clear;
307
308 for match in TRegEx.Matches(txt, pattern1, [roExplicitCapture]) do
309 begin
310 for group in match.Groups do
311 begin
312 Memo1.Lines.Add(group.Value);
313 end;
314 end;
315 Memo1.Lines.Add('--------------------');
316
317 for match in TRegEx.Matches(txt, pattern1) do //此处把 pattern1 换做 pattern2 或 pattern3 均可
318 begin
319 for group in match.Groups do
320 begin
321 Memo1.Lines.Add(group.Value);
322 end;
323 end;
324 Memo1.Lines.Add('--------------------');
325
326 for match in TRegEx.Matches(txt, pattern2, [roExplicitCapture]) do
327 begin
328 for group in match.Groups do
329 begin
330 Memo1.Lines.Add(group.Value);
331 end;
332 end;
333 Memo1.Lines.Add('--------------------');
334
335 for match in TRegEx.Matches(txt, pattern3, [roExplicitCapture]) do
336 begin
337 for group in match.Groups do
338 begin
339 Memo1.Lines.Add(group.Value);
340 end;
341 end;
342 end;
343 {*********************
344 AA11
345 BB22
346 --------------------
347 AA11
348 AA
349 11
350 BB22
351 BB
352 22
353 --------------------
354 AA11
355 AA
356 BB22
357 BB
358 --------------------
359 AA11
360 11
361 BB22
362 22
363 **********************}
364
365 {roCompiled}
366 procedure TForm1.Button4Click(Sender: TObject);
367 var
368 reg: TRegEx;
369 begin
370 reg := TRegEx.Create('d+', [roCompiled]);
371 Memo1.Text := reg.Replace('AA11 BB22', '..'); //AA.. BB..
372 end;
373
374 {roSingleLine}
375 procedure TForm1.Button5Click(Sender: TObject);
376 const
377 pattern = '[A-Z]{1}.{1}';
378 txt = 'A B C D'#13#10'A B C D'#13#10'A B C D';
379 var
380 rStr: string;
381 begin
382 Memo1.Clear;
383 rStr := TRegEx.Replace(txt, pattern, '11', [roSingleLine]);
384 Memo1.Lines.Add(rStr);
385 Memo1.Lines.Add('--------------------');
386
387 rStr := TRegEx.Replace(txt, pattern, '11');
388 Memo1.Lines.Add(rStr);
389 end;
390 {*********************
391 11111111
392 11111111
393 111111D
394 --------------------
395 111111D
396 111111D
397 111111D
398 **********************}
399
400 {roIgnorePatternSpace}
401 procedure TForm1.Button6Click(Sender: TObject);
402 var
403 rStr: string;
404 begin
405 Memo1.Clear;
406 {忽略空白}
407 rStr := TRegEx.Replace('ABC,A B C,AB C', 'AB C', '...', [roIgnorePatternSpace]);
408 Memo1.Lines.Add(rStr); //...,A B C,AB C
409 rStr := TRegEx.Replace('ABC,A B C,AB C', 'AB C', '...');
410 Memo1.Lines.Add(rStr); //ABC,A B C,...
411 Memo1.Lines.Add('--------------------');
412
413 {使用注释}
414 rStr := TRegEx.Replace('ABC123', 'ABC#*123', '...', [roIgnorePatternSpace]);
415 Memo1.Lines.Add(rStr); //...123
416 rStr := TRegEx.Replace('ABC123', 'ABC#*123', '...');
417 Memo1.Lines.Add(rStr); //...
418 end;
419 {*********************
420 ...,A B C,AB C
421 ABC,A B C,...
422 --------------------
423 ...123
424 ...
425 **********************}
426
427 {选项集合}
428 procedure TForm1.Button7Click(Sender: TObject);
429 const
430 pattern = '^Delphi';
431 txt = 'DELPHI DELPHI DELPHI'#13#10'delphi delphi delphi';
432 begin
433 Memo1.Text := TRegEx.Replace(txt, pattern, '......', [roIgnoreCase, roMultiLine]);
434 end;
435 {*********************
436 ...... DELPHI DELPHI
437 ...... delphi delphi
438 **********************}