zoukankan      html  css  js  c++  java
  • RegularExpressions(5) RegularExpressions 成员(二) IRegex


    //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.FormCreate(Sender: TObject);
    var
      Match: IMatch;
      MatchCollection: IMatchCollection;
      Pattern, Input, str: string;
    begin
      Pattern := '([A-Za-z]+)(\d+)';
      Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';
    
      //
      Match := TRegex.Match(Input, Pattern);
      ShowMessage(Match.Value); { AAA1 }
    
      //
      MatchCollection := TRegex.Matches(Input, Pattern);
      ShowMessage(IntToStr(MatchCollection.Count)); { 4 }
      
      //
      str := TRegex.Replace(Input, Pattern, '◆');
      ShowMessage(str); { ◆ ◆ ◆ ◆ ◆ ◆ AAAA }
    end;
    

    Escape 与 Unescape 测试:
    uses RegularExpressions;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      str: string;
    begin
      str := TRegex.Escape('.$^{[(|)*+?\');
      ShowMessage(str);  (* \.\$\^\{\[\(\|\)\*\+\?\\ *)
      str := TRegex.Unescape(str);
      ShowMessage(str);  (* .$^{[(|)*+?\ *)
    end;
    

    Replace 函数有很多重载, 如:
    uses RegularExpressions;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Regex: IRegex;
      Match: IMatch;
      Pattern, Input, str: string;
    begin
      Pattern := '([A-Za-z]+)(\d+)';
      Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';
      Regex := TRegex.Create(Pattern);
    
      { 替换全部 }
      str := Regex.Replace(Input, '◆'); 
      ShowMessage(str); { ◆ ◆ ◆ ◆ ◆ ◆ AAAA }
    
      { 只替换前两个匹配 }
      str := Regex.Replace(Input, '◆', 2);
      ShowMessage(str); { ◆ ◆ AA11 BB22 A111 B222 AAAA } 
    
      { 从第 10 个字符开始, 只替换两个匹配 }
      str := Regex.Replace(Input, '◆', 2, 10);
      ShowMessage(str); { AAA1 BBB2 ◆ ◆ A111 B222 AAAA } 
    end;
    

    Replace 函数中还应该有一个 TMatchEvaluator 事件参数, 它可以执行一些更高级的替换, 遗憾的是当前版本也没有实现.

    尽管有不少东西还没实现, 但试用下来感觉还是蛮不错的, 可以放弃 PerlRegEx 了!

  • 相关阅读:
    基于element-ui图片封装组件
    计算时间间隔具体每一天
    C语言学习笔记 —— 函数作为参数
    AtCoder Beginner Contest 049 题解
    AtCoder Beginner Contest 048 题解
    AtCoder Beginner Contest 047 题解
    AtCoder Beginner Contest 046 题解
    AtCoder Beginner Contest 045 题解
    AtCoder Beginner Contest 044 题解
    AtCoder Beginner Contest 043 题解
  • 原文地址:https://www.cnblogs.com/del/p/1641162.html
Copyright © 2011-2022 走看看