文档章节

RegularExpressions(5) RegularExpressions 成员(二) IRegex

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 577
阅读 2
收藏 0

//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 了!

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

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
正则表达式的初体验:分析字符串数据

在程序中,对于数据的分析是非常重要及常见的。对于字符串数据的分析,往往就是对字符串的内容提取,捕获和替换。除非你要做的分析是简单的要求,否则你就不要再使用string的IndexOf、LastI...

彭博
2012/03/09
71
0
winform联网查询

using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Windows.Forms; using System.Data.OleDb; using System.IO; using System.Net; usi......

宇不会停
2013/11/22
179
0
c#中分割字符串的几种方法

最近经常看到论坛中许多帖子询问如何使用split来分割字符串,我这里对split做一些简单的总结,希望能够对大家有所帮助。下面介绍几种方法: 第一种方法:打开vs.net新建一个控制台项目。然后...

晨曦之光
2012/03/09
18
0
关于正则MatchCollection.Count属性严重影响执行效率问题

我是做数据采集的 对HTML页面的数据分析一直使用正则表达式去解决 昨天突然发现一个很纠结的问题 MatchCollection.Count在解析不同页面后计算数量时 执行效率不一 甚至需要500毫秒以上 这种情...

落幕残情
2014/08/29
265
2

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
54分钟前
1
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部