飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

Delphi正则表达式使用方法(TPerlRegEx)

Author:飘易 Source:飘易
Categories:电脑技术 PostTime:2009-7-14 16:47:23
正 文:
    使用Delphi开发软件无疑是一种比较高效率的方式,完全对象的语言,严格控制的语法,可视化开发环境的性能,编译器的速度和已编译代码的效率,编程语言的功能及其复杂性,数据库结构的灵活性和可扩展性,框架对设计和使用模式的扩充无疑都是delphi身上的光芒。

    最近飘易使用Delphi开发了一套工具,由于和网络应用相关的东西较多,需要使用正则表达式,而目前主流的delphi下的正则表达式,应该是 PerlRegEx 。

    官方网站: http://www.regular-expressions.info/delphi.html
    直接下载: http://www.regular-expressions.info/download/TPerlRegEx.zip

    安装方法(飘易使用的delphi版本是 delphi2007):

1、先把解压的 TPerlRegEx 文件夹放在 Delphi 的根目录下的 Imports 目录中。

2、目前最新 For Win32 的版本是可以在 Delphi7,Delphi 2006,Delphi 2007,Delphi 2009 下使用。飘易用的是2007,于是就打开 PerlRegExD2007.dpk ,在 Project Manager 窗口中的 PerlRegExD2007.bpl 上点击右键,执行 Install。这时在 Tool Palette 的列表中已经有了 TPerlRegEx,在 JGsoft 组。

3、Tools -> Options -> Environment Options -> Delphi Options -> Library-Win32 -> Library path -> 添加路径:$(BDS)\Imports\TPerlRegEx (注:就是刚才放置的路径)。

4、打开delphi根目录下 Imports\TPerlRegEx\pcre ,把 pcre3.dll 文件复制到 C:\WINDOWS\system32 文件夹下,这个文件夹里是windows系统存放 dll 文件的大本营。如果不复制pcre3.dll,在应用 TPerlRegEx 正则的时候,系统提示出错。

5、用delphi打开 Imports\TPerlRegEx 目录下的 pcre.pas 文件,找到 //{$DEFINE PCRE_STATICLINK} ,把之前的注释 // 删除;找到 {$DEFINE PCRE_LINKDLL} ,把它注释掉,即改为 //{$DEFINE PCRE_LINKDLL} 。

注意:这点非常重要,如果不这样改的话,在软件开发完成后,分发到其他电脑上的时候,软件就会提示“缺少pcre3.dll错误”。这样修改的原因,是把正则直接封包到 exe 文件里,而不需要链接 pcre3.dll 了;封包进 exe,付出的代价是软件增大了 100KB 左右的大小,当然比起必须携带 pcre3.dll来说,这是有意义的付出。 

具体的原因,看下面的官方解释:
// Define PCRE_STATICLINK to link the OBJ files with PCRE 7.7.
// Due to bugs in the Delphi compiler, you may get an internal error if install TPerlRegEx into a design time package,
// and you don't put TPerlRegEx into a runtime package either.
// You can use PCRE_STATICLINK if you don't use packages at all (which means you don't install it into the IDE and you don't drop TPerlRegEx on a form)
// You can also use PCRE_STATICLINK if you put the component into a runtime package

6、可以使用了! 直接 uses PerlRegEx 或从 Tool Palette 添加都可以。  (以上部分方法参考)

    TPerlRegEx 安装设置完成后,就可以舒心地使用了,一些简单的使用方法如下:

//查找是否存在
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);
  reg.Subject := 'CodeGear Delphi 2007 for Win32';
  reg.RegEx   := '\d';
  if reg.Match then
    ShowMessage('找到了')
  else
    ShowMessage('没找到');
  FreeAndNil(reg);
end;

//替换一般字符串
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := '我爱DELPHI, 但Delphi不爱我!';
reg.RegEx   := 'Delphi';
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //返回: 我爱DELPHI, 但◆不爱我!          
FreeAndNil(reg);
end;

//分别显示找到的每一个和总数
var
  reg: TPerlRegEx;
  num: Integer; //用 num 来计数
begin
  reg := TPerlRegEx.Create(nil);

  reg.Subject := 'CodeGear Delphi 2007 for Win32';
  reg.RegEx   := '\d';

  num := 0;
  while reg.MatchAgain do  //MatchAgain 是下一个
  begin
    ShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 7 3 2
    Inc(num);
  end;
    ShowMessage(IntToStr(num)); //6

  FreeAndNil(reg);
end;

//目标字符串的位置与长度
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);

  reg.Subject := 'CodeGear Delphi 2007 for Win32';
  reg.RegEx   := 'Delphi';

  while reg.MatchAgain do  //很明显: 本例只能找到一个结果
  begin
    ShowMessage(reg.MatchedExpression); //找到的字符串: Delphi
    ShowMessage(IntToStr(reg.MatchedExpressionOffset)); //它所在的位置: 10
    ShowMessage(IntToStr(reg.MatchedExpressionLength)); //它的长度: 6
  end;

  FreeAndNil(reg);
end;

    关于更详细的 正则表达式 的使用方法,大家可以参考阅读:

Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找 
Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式 
Delphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start、Stop 
Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace 
Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile、Study 
Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数 
Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数 
作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:“绿坝”为何遭遇质疑
下一篇:最近流行“门事件”:7门爆眼球?
9条评论 “Delphi正则表达式使用方法(TPerlRegEx)”
2010-1-5 15:30:16
好文章,支持
Delphi正则很少内容
2 炒饭
2010-6-4 21:21:27
万老师  请教一下。有一组数据如下 ,以第一个为例,我要从中取得 :Adult-115-0.html ;Adult ;和 0  ;正表达试如何写?获取后要分类写入数据表 如:maincat:Adult  ,count:0 ,url: Adult-115-0.html .  


<li class=listings > <a href=Adult-115-0.html ><span class=maincat>Adult</span></a> <span class=count>(0)</span></li>

<li class=listings ><a href=Aromatherapy-1-0.html ><spanclass=maincat>Aromatherapy</span></a><span class=count>(7)</span></li> 

<li class=listings ><a href=Baby_Goods-12-0.html ><span class=maincat><b>Baby Goods</b></span></a><span class=count>(15)</span></li>

<li class=listings ><a href=Badges_and_Pins-10-0.html ><span class=maincat>Badges and Pins</span></a><span class=count>(4)</span></li>

大概有30行左右  期待解答
3 Flymorn
2010-6-5 13:02:04
炒饭:
你好。我不是万老师,但也回复你一下吧,分三次匹配:

reg:=TPerlRegEx.Create(nil); //建立正则
reg.Subject:=s1; //源字符串放在s1里
reg.RegEx:='(href=)(.*?)?( ><)';
if reg.Match then s2:=GetMid(reg.MatchedExpression,'href=',' ><');  //获取到网址,如Adult-115-0.html

对于maincat字段和count字段,用同样的正则匹配。其中,getmid函数是取中间串的自定义函数。
对于有b标记的,可以过滤下:

reg.Subject:=s4;  //过滤Html标记
reg.RegEx:='<(.*?)?>';
reg.Replacement:='';
reg.ReplaceAll;
s4:=reg.Subject; // 过滤后的
4 EssenChan
2010-6-22 15:41:34
'5、用delphi打开 Imports\TPerlRegEx 目录下的 pcre.pas 文件,找到 //{$DEFINE PCRE_STATICLINK} ,把之前的注释 // 删除;找到 {$DEFINE PCRE_LINKDLL} ,把它注释掉,即改为 //{$DEFINE PCRE_LINKDLL} 。'

官网下的包,但是“{$DEFINE PCRE_STATICLINK}”前面没有“//”,跳过。
另外,“{$DEFINE PCRE_LINKDLL}”有两处,注释后编译(Delphi 7下)提示出错,提示信息:
Unsatisfied forward or external declaration:'pcre_compile'
Unsatisfied forward or external declaration:'pcre_compile2'
Unsatisfied forward or external declaration:'pcre_config'
Unsatisfied forward or external declaration:'pcre_copy_named_substring'
.
.

此外,包里面只有一个“pcrelib.dll”,没有上文第4点中提到的“pcre3.dll”。


是否上文有笔误,能否把你下载的包发过来看看,我的邮箱是akchen@126.com,谢谢。
5 飘易
2010-6-22 19:25:16
回复:EssenChan
你好。我当时下载的版本(PCRE 7.7)仅支持到delphi2009,而最新的版本(PCRE 7.9)已经加入了对delphi2010的支持。新版采用了 pcrelib.dll,而不是 pcre3.dll。
{$DEFINE PCRE_LINKDLL}新版应该不需要再注释了。
请阅读pcre.pas里面的说明:
    // Define PCRE_STATICLINK to link the OBJ files with PCRE 7.9.
    // This works correctly in all cases with Delphi 2010 (and later).
    // Delphi 2009 and earlier have a compiler bug that may cause an internal error if install TPerlRegEx
    // into a design time package, and you don't put TPerlRegEx into a runtime package at the same time.
    // With Delphi 2009 and earlier you can use PCRE_STATICLINK if you don't use packages at all
    // (which means you don't install it into the IDE and you don't drop TPerlRegEx on a form)
    // You can also use PCRE_STATICLINK if you put the component into a runtime package
6 EssenChen
2010-6-23 13:53:13
谢谢回复。

在问以上问题前,该控件已安装完成,并可以通过点击Palette中的JGsoft使用。
但是一直没有解决分发到其他电脑上的时候,软件提示“缺少pcrelib.dll”错误。

排查了一下,原因大概在{$DEFINE PCRE_LINKDLL},见下:

{$IFDEF CONDITIONALEXPRESSIONS}
  {$IF COMPILERVERSION >= 21.0}
    {$DEFINE PCRE_STATICLINK}
  {$ELSE}
    // Define PCRE_LINKDLL to use pcrelib.dll
    {$DEFINE PCRE_LINKDLL}
  {$IFEND}
{$ELSE}
  // Define PCRE_LINKDLL to use pcrelib.dll
  {$DEFINE PCRE_LINKDLL}
{$ENDIF}

但是又不可以注释掉{$DEFINE PCRE_LINKDLL}(会提示出错,见2010-6-22 15:41:34的回复)。

所以请教一下,怎样在当前版本(PCRE 7.9)和编译环境(Delphi 7)实现

是把正则直接封包到 exe 文件里,而不需要链接 pcrelib.dll 了;封包进 exe,付出的代价是软件增大了 100KB 左右的大小,当然比起必须携带 pcrelib.dll来说,这是有意义的付出。

这个效果,谢谢!
7 a去
2010-8-13 9:11:58
你也可以吧dll放在软件里,嘿嘿
8 俾斯麦
2010-10-22 17:06:15
如果备份一个mysql的数据库,然后把这个备份文件中的内容都读取出来的,怎么用正则来获取每条语句,就是说怎么样判断,每条完整的sql语句到哪里结束
9 彩虹姐姐
2016-8-18 15:19:56
大师,我按您的步骤来的,可是应用 TPerlRegEx 正则的时候,系统提示出错,就是User PerlRegEx下面出现红波浪线!我现在用的是delphi10, PerlRegEx2010!请大师指点迷津!
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2019 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有