【转】DelphiXE2 使用正则式

  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 **********************} 
posted @ 2012-05-19 02:21  极度生存  阅读(563)  评论(0编辑  收藏  举报