TRegExpr正则表达式

 转载:DELPHi中的REGEXPR

其实这个Pascal单元我在几个论坛上面都推荐过,也是我唯一会用的DELPHI下面的正则表达式实现。
正则表达式是个极其繁琐和强大的东西,小生才疏学浅,也不准备写正则表达式的教程,借着对这个单元的介绍,会有一些浅显且有用的例子。
首先介绍的是这个单元的主角:TRegExpr类,这个类包括很多成员,这里仅简单的介绍一下一般匹配的过程。下面是一段在文本中提取邮件地址的代码:


Procedure GetName(TextToCheck:String;aList:TStringList);
Var
    myExpr: TRegExpr;
begin
    myExpr := TRegExpr.Create;
    Try
        myExpr.Expression := 'name="(.*?)"';
        if myExpr.Exec(TextToCheck) then
        repeat
            aList.Add(myExpr.Match[1]);
        until not MyExpr.ExecNext;
    finally
        myExpr.Free;
    end;
end;



  下面对这段代码进行一点简要的说明.
  首先是myExpr.Expression := 'name="(.*?)"';这个语句用以匹配name="XXXXX"形式的字符串。
“.*?”是很常见的一段,表示对任意字符串的“非贪婪匹配”,代表符合匹配条件的最短字符串,关于贪婪非贪婪的问题,会在后面说明。
  括号表示对这段文字的引用,匹配中出现符合该模式的字符串将会存储在TRegExpr的Match数组中。
  接下来是if myExpr.Exec(TextToChceck)这一句,这一语句就是开始利用上文提到的正则表达式对TextToCheck进行匹配。Exec方法有三个重载:

function Exec (const AInputString : AnsiString) : boolean; //对AInputString参数进行匹配
function Exec : boolean; overload; //对InputString成员进行匹配
function Exec (AOffset: integer) : boolean; overload; //对InputString成员,从AOffset位置开始进行匹配


 

  该方法返回一个布尔型的值,如果为真,则表明InputString中包含表达式所匹配的模式,例如'Name="Hello.Gif"'作为参数,就会返回True。

  接下来的语句中出现的myExpr.Match[1],则用以取出本次匹配结果

  最后的ExecNext其实是使用了上面提到的第三个重载,用来对重复出现的字符串进行连续匹配,返回结果的含义同Exec相同

  接下来谈谈Match成员,其中Match[0]表示整个表达式的匹配结果,之后的数组元素则代表括号中的匹配结果,元素编号按照括号从左到右的顺序递增,嵌套括号则以从内向外的顺序递增。例如一个简单的对E-Mail地址的匹配:
Quotes From ???
输入字符串:'"dirt@sina.com","v@d2g.com"'
正则表达式:'"((.*?)@(.*?))",'
执行结果如下:
0 "dirt@sina.com",
1 dirt@sina.com
2 dirt
3 sina.com
  从中即可看出Match数组中的结果排列顺序。


  而上文中出现的.*?经常用于不很严谨的场合,例如前面用到的邮件地址提取,有人就写出几百字符的的验证表达式。其中“.”表示任意单个字符,“*” 表示前面的字符(串)至少出现一次,而'?'在这里就是非贪婪限定符,举一个简单的例子:"aaa""bbb",这样一个字符串,如果用'" (.*?)"'进行匹配,则Match[1]的内容就是'aaa',如果去掉了其中的'?',则Match[1]就变成了'aaa""bbb',这就可以 看出贪婪和非贪婪的区别。

  一个基本的匹配过程就到这里,有空会再继续写一些其他的相关内容,敬请丢砖

 


在Delphi7中使用RegExpr类(正则表达式类)  

    在 Delphi 中是没有自带的正则表达式库的,在网上能找到的用于 Delphi 的正则表达式类大体上有两个,分别是 PerlRegEx 和 RegExpr。前者相当强大,但发布程序时需要带上他的一个 DLL 文件,感觉很麻烦。而后者是完全使用 Delphi 来实现,虽然功能稍微逊色,但是发布和使用较为方便,直接使用源文件,而发布时也无须增加任何文件。
    那么我们就来说说后者,顺便学习一下。

    源文件与示例下载:http://regexpstudio.com/TRegExpr/TRegExpr.html

    附加工具RegExpStudio下载:http://regexpstudio.com/RegExpStudio.html

    正则表达式语法:http://regexpstudio.com/TRegExpr/Help/RegExp_Syntax.html

    要使用他只需要添加RegExpr.pas到你的project(Delphi主菜单 Project -> Add to project..),然后在要使用正则的单元里申明就行了,如:

implementation
uses
RegExpr;
{$R *.DFM}

    注意,最好添加在 implementation 之后,而不是 interface 之后。interface 后面使用的是系统自带的,而 implementation 后是自定义的。详细解说请看这里。

    一个简单的示例,提取所有的邮箱的函数,调用此函数会返回文本里所有的邮箱:

function ExtractEmails(const AInputString: string): string;
const
EmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';
var
    r: TRegExpr;
begin
    Result := '';
    r := TRegExpr.Create;
    try
       r.Expression := EmailRE;
       if r.Exec(AInputString) then
       repeat
            Result := Result + r.Match[0] + ',';
       until not r.ExecNext;
    finally 
        r.Free;
    end;
end;


 

    下面是我从 Help 文件里翻译出的一些主要接口的说明:(注:有英语大虾吗?希望那位英语大虾能全部都翻译出来。)

class function VersionMajor : integer;
返回主版本号。
class function VersionMinor : integer;
返回副版本号。

比如我下载的版本是 v0.944,那么 VersionMajor = 0、VersionMinor = 944,是无多大实际意义的方法啊。

function Exec (const AInputString : string) : boolean;
返回字符串 AInputString 是否匹配。

function ExecNext : boolean;
查找是否还有下一个匹配项。

property MatchPos [Idx : integer] : integer;
返回指定的匹配字符串的起始位置。

property MatchLen [Idx : integer] : integer;
返回指定的匹配字符串的长度。

property Match [Idx : integer] : string;
返回指定的匹配字符串。

function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : string; AUseSubstitution : boolean = False) : string;
将匹配的所有字符串替换成 AReplaceStr 并返回。

另外 \n 表示回车,\s 表示空格,^ 表示取反,- 表示连接(如a-z,表示24个小写的英文字母),| 表示或,& 表示和。

    还有很多方法,大家可以去参考示例文件和 Help 文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值