文档章节

RegularExpressions(4) RegularExpressions 成员(一)

涂孟超
 涂孟超
发布于 2014/09/26 15:31
字数 495
阅读 1
收藏 0

主要成员有: IRegex、ICapture、IMatch、IMatchCollection、IGroup、IGroupCollection

先看: ICapture; 常用的 IMatch、IGroup 都是从它继承而来; 作为一个底层接口一般不会被直接使用.
它为 IMatch、IGroup 提供了三个属性: Index、Length、Value; 还有一个 ToString 方法也是获取 Value.

IMatchCollection、IGroupCollection 分别是 IMatch、IGroup 的集合.
作为集合都有 Count 属性和 Items[] 属性; 它们的 GetEnumerator 方法支持了 for in 循环.
和线程支持相关的三个属性: IsReadOnly、IsSynchronized、SyncRoot 在当前版本并没有实现.

另外 IGroupCollection 比 IMatchCollection 多出来一个 ItemsByName[] 属性, 用于获取指定名称的子表达式, 如:
uses RegularExpressions;

procedure TForm1.FormCreate(Sender: TObject);
var
  Regex: IRegex;
  Match: IMatch;
  w,n: string;
begin
  Regex := TRegex.Create('(?<Name1>[A-Za-z]+)(?<Name2>\d+)');
  Match := Regex.Match('AAA1 BBB2 AA11 BB22 A111 B222 AAAA');

  while Match.Success do
  begin
    w := Match.Groups.ItemsByName['Name1'].Value; { AAA ...}
    n := Match.Groups.ItemsByName['Name2'].Value; {1 ...}
    ShowMessageFmt('%s, %s', [w, n]);
    Match := Match.NextMatch;
  end;
end;

 
 
 
 
 

 

 

  

IMatchCollection 在当前版本应该尽量少用, 因为有个 bug:
获取 IMatchCollection 后, 其中的 IMatch 对象不包含子表达式的信息!
假如不需要子表达式的信息, 则可以使用(假如需要可以使用 IMatch.NextMatch 方法, 前面有例子):
uses RegularExpressions;

procedure TForm1.FormCreate(Sender: TObject);
var
  Regex: IRegex;
  Input, Pattern: string;
  MatchCollection: IMatchCollection;
  Match: IMatch;
begin
  Pattern := '([A-Za-z]+)(\d+)';
  Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';

  Regex := TRegex.Create(Pattern);

  MatchCollection := Regex.Matches(Input);
  for Match in MatchCollection do
  begin
    ShowMessage(Match.Value);
  end;
end;

 
 
 
 
 

 

 

  

IMatch 与 IGroup 是两个重要的对象接口.

IMatch 是表达式匹配的结果;
其 Success 方法表示匹配是否成功;
其 NextMatch 方法是继续匹配下一个, 并返回下一个 IMatch 对象.

IGroup 表示一个子表达式的匹配结果, 一个 IMatch 中可能会包含若干个 IGroup.

下面程序可遍历出所有匹配到的子表达式:
uses RegularExpressions;

procedure TForm1.FormCreate(Sender: TObject);
var
  Regex: IRegex;
  Input, Pattern, str: string;
  Match: IMatch;
  Group: IGroup;
begin
  Pattern := '([A-Za-z]+)(\d+)';
  Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';

  Regex := TRegex.Create(Pattern);
  Match := Regex.Match(Input);
  
  while Match.Success do
  begin
    for Group in Match.Groups do
    begin
      Memo1.Lines.Add(Group.Value);
    end;
    Match := Match.NextMatch;
  end;
end;

 
 
 
 
 

 

 

  

说没了, 只剩 IRegex 了.

本文转载自:http://www.cnblogs.com/del/archive/2010/01/07/1641084.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
正则表达式 捕获组语法

捕获组 语法: 字符 描述 示例 (pattern) 匹配pattern并捕获结果,自动设置组号。 (abc)+d 匹配abcd或者abcabcd (?<name>pattern) 或 (?'name'pattern) 匹配pattern并捕获结果,设置name为组......

aiaa5505
2016/03/07
29
0
Android Studio - 第四十二期 几个经常用到的字符串的截取

string str="123abc456"; int i=3; 1 取字符串的前i个字符 str=str.Substring(0,i); // or str=str.Remove(i,str.Length-i); 2 去掉字符串的前i个字符: str=str.Remove(0,i); // or str=str......

吴雨声
2017/07/19
0
0
《.Ne框架程序设计》随记(2)

CLR直接打交道的并不是托管模块,而是程序集(assembly). 程序集是一个或多个托管模块,以及一些资源文件的逻辑组合。其次,程序集是组件复用以及实施安全策略,版本策略的最小单位。它可以...

嗯哼9925
2017/12/19
0
0
刚刚找到的IP地址对应地区数据库

项目原因,网上下载了 We7 CMS安装版,(想下载源码竟然发现要加入什么什么源码小组,还要一年交¥100,晕,这叫什么GP开源啊!!!),下载下来看了下app_data目录,惊奇发现有个ip.db,呵呵...

niunan
2010/06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

任务调度-单体应用定时任务解决方案

1. 应用场景: 单体应用(并发少、就公司内部使用)、业务比较简单、单一、稳定,传统行业首选,项目初期。 2. 主要方式: Spring XML配置方式,timer。 <bean id="cycleBonusTimer" class="...

秋日芒草
35分钟前
3
0
EditText中singleLine过期替代方法

android:lines="1" android:inputType="text"

球球
49分钟前
1
0
删除 Tomcat-webapps 目录自带项目

本文将 %CATALINA_HOME% 目录称为“tomcat”目录。 1.webapps目录中的项目 在 Tomcat 8.0 的 tomcat/webapps 目录中,含有 5 个 Tomcat 自带的 Web 项目,如下所示: docs 有关于 Tomcat 的介...

Airship
53分钟前
3
0
好文:华杉:我等用功,不求日增,但求日减。减一分人欲,则增一分天理,这是何等简易!何等洒脱!

#写在前面1.怎么理解“减一分人欲,则增一分天理,这是何等简易!”?1)华杉提倡 “一劳永逸” 排除浪费,少干活,多赚钱,一战而定,降低作业成本。2)华杉提倡学海无涯,回头是岸...

阿锋zxf
今天
3
0
vue 的bus总线

bus声明 global.bus = new Vue() 事件发送 controlTabbar () {global.bus.$emit('pickUp', 'ddd')}, 事件接收 global.bus.$on('pickUp', (res) => {this.isFocus = true})......

Js_Mei
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部