码迷,mamicode.com
首页 > Windows程序 > 详细

Delphi XE 中使用正则表达式

时间:2015-03-03 11:18:53      阅读:539      评论:0      收藏:0      [点我收藏+]

标签:

在Delphixe系列中,已经融合了正则表达式类TRegEx,在我们需要使用的时候,Uses RegularExpressions单元即可。

TRegEx 是一个结构 ,使用时不用释放。他内部还是用TPerlRegEx 类来实现。

//IRegex 的属性与方法
IRegex.GetGroupNames; { 子表达式编号数组, 譬如有两个子表达式, 会得到 0,1,2; 这基本无用 }
IRegex.GetGroupNumbers; { 同上, 只是获取的是整数数组 }
IRegex.GroupNameFromNumber(); { 应该是从子表达式编号获取子表达式的名称; 但没有实现, 来回都是编号 }
IRegex.GroupNumberFromName(); { 同上一个是反着的; 基本都无用 }
IRegex.IsMatch(); { 判断是否有所匹配; 如果只想知道是否匹配到, 用它应该最快 }
IRegex.Match(); { 获取一个 IMatch 对象, 这是第一个匹配结果 }
IRegex.Matches(); { 获取一个 IMatchCollection 对象; 这是匹配到的 IMatch 的集合 }
IRegex.Replace(); { 替换 }
IRegex.Split(); { 根据表达式分割字符串; 当前版本没有实现好, 暂时无用 }
IRegex.ToString; { 获取表达式文本 }
IRegex.Save(); { 把表达式保存到流 }
IRegex.Load(); { 从流中取回由 Save 保存的表达式 }
IRegex.Options; { 选项集合, 是只读的; 要设置只能从 Create 方法中 }
{这其中需要重新看看的只有 Replace}

//IRegex 是通过 TRegex 实现的, TRegex 还有下面几个静态类方法:
TRegex.Escape(); { 编码需要转义的字符 }
TRegex.Unescape(); { 还原 Escape 的编码 }
TRegex.IsMatch(); { 同 IRegex.IsMatch }
TRegex.Match(); { 同 IRegex.Match }
TRegex.Matches(); { 同 IRegex.Matches }
TRegex.Replace(); { 同 IRegex.Replace }
TRegex.Split(); { 同 IRegex.Split }
{ 使用这些个类方法会让代码更简单 }

 

Uses RegularExpressions;

{判断是否有匹配}
procedure TForm1.Button1Click(Sender: TObject);
var
  match: TMatch;
  txt,pattern:String;
begin
  txt:=‘AAA1 BBB2 AA11 BB22 A111 B222 AAAA‘;
  pattern:=‘[A-Za-z]+\d+‘;
  if TRegEx.IsMatch(txt, pattern) then Showmessage(‘有匹配到‘);
end;

{获取第一个匹配结果}
procedure TForm1.Button2Click(Sender: TObject);
var
  match: TMatch;
  txt,pattern:String;
begin
  txt:=‘AAA1 BBB2 AA11 BB22 A111 B222 AAAA‘;
  pattern:=‘[A-Za-z]+\d+‘;
  match := TRegEx.Match(txt, pattern);
  if match.Success then ShowMessage(match.Value);
end;

{获取所有匹配结果}
//使用Match.NextMatch时先实例化对象
procedure TForm1.Button3Click(Sender: TObject);
var
  reg: TRegEx;
  match: TMatch;
  txt,pattern:String;
  matchs: TMatchCollection;
begin
  txt:=‘AAA1 BBB2 AA11 BB22 A111 B222 AAA2‘;
  pattern:=‘[A-Za-z]+\d+‘;
  Reg := TRegEx.Create(pattern);
  match := reg.Match(txt);
  Memo1.Clear;
  while Match.Success do begin
    Memo1.Lines.Add(match.Value);
    Match := Match.NextMatch;
  end;
(*
  获取结果,如下:
  AAA1
  BBB2
  AA11
  BB22
  A111
  B222
  AAA2
  *)
end;

{替换}
procedure TForm1.Button4Click(Sender: TObject);
Var
  reg: TRegEx;
  Str:String;
  txt,pattern:String;
begin
  txt:=‘AAA1 BBB2 AA11 BB22 A111 B222 AAAA‘;
  pattern:=‘([A-Za-z]+)(\d+)‘;
  { 把表达式匹配到的文本替换为 ◆ }
  Str := TRegEx.Replace(txt,pattern,‘◆‘);
  Memo1.Lines.Add(‘替换:‘+Str); //获取结果:替换:◆ ◆ ◆ ◆ ◆ ◆ AAAA

  { 把表达式匹配到的文本替换为 "第一个子表达式的匹配结果", 这里相当于删除数字 }
  Str := TRegEx.Replace(txt,pattern,‘$1‘);
  Memo1.Lines.Add(‘替换:‘+Str); //获取结果:替换:AAA BBB AA BB A B AAAA

  { 把表达式匹配到的文本替换为 "第二个子表达式的匹配结果", 这里相当于删除字母 }
  Str := TRegEx.Replace(txt,pattern,‘$2‘);
  Memo1.Lines.Add(‘替换:‘+Str); //获取结果:替换:1 2 11 22 111 222 AAAA

  //只替换前两个匹配
  reg := TRegex.Create(Pattern);
  Str := reg.Replace(txt,‘◆‘,2);
  Memo1.Lines.Add(‘替换:‘+Str); //获取结果:替换:◆ ◆ AA11 BB22 A111 B222 AAAA
end;

{提取}
procedure TForm1.Button5Click(Sender: TObject);
var
  reg: TRegEx;
  match: TMatch;
  s,w,n: string;
  txt,pattern:String;
  matchs: TMatchCollection;
begin
  txt:=‘AAA1 BBB2 AA11 BB22 A111 B222 AAAA‘;
  pattern:=‘([A-Za-z]+)(\d+)‘;
  Reg := TRegEx.Create(pattern);
  match := reg.Match(txt);
  Memo1.Clear;
  while Match.Success do begin
    s := Match.Groups[0].Value; { Groups[0] 放置整个表达式的匹配结果 }
    w := Match.Groups[1].Value; { Groups[1] 放置第一个子表达式的匹配结果 }
    n := Match.Groups[2].Value; { Groups[2] 放置第二个子表达式的匹配结果 }
    ShowMessageFmt(‘子串: %s; 字母: %s; 数字: %s‘, [s, w, n]);
    Match := Match.NextMatch;
  end;
(*
  子串: AAA1; 字母: AAA; 数字: 1
  子串: BBB2; 字母: BBB; 数字: 2
  子串: AA11; 字母: AA; 数字: 11
  子串: BB22; 字母: BB; 数字: 22
  子串: A111; 字母: A; 数字: 111
  子串: B222; 字母: B; 数字: 222
*)
end;

  

Delphi XE 中使用正则表达式

标签:

原文地址:http://www.cnblogs.com/sishen/p/4310412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!