随笔 - 1656  文章 - 26 评论 - 6694 trackbacks - 253

提示1: 点击 标题 可进入首页;   提示2: 从搜索引擎中搜索 万一 可迅速找到这里.

随笔分类(1869)

随笔档案(1584)

积分与排名

  • 积分 - 1724810
  • 排名 - 10

最新评论

在 Delphi 中使用正则表达式, 目前 PerlRegEx 应该是首选, 准备彻底而细致地研究它.


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


安装方法:

1、先把解压的 TPerlRegEx 文件夹放一个合适的地方, 我放在了 Delphi 的 Imports 目录中.

2、目前最新 For Win32 的版本是对 Delphi 2006 的, 2007 也能用. 
    打开 PerlRegExD2006.dpk, 提示缺少资源文件, 没关系; 
    在 Project Manager 窗口中的 PerlRegExD2006.bpl 上点击右键, 执行 Install;
    这时在 Tool Palette 的列表中已经有了 TPerlRegEx, 在 JGsoft 组.

3、Tools -> Options -> Environment Options -> Delphi Options -> Library-Win32 -> Library path -> 
    添加路径: ...\Imports\TPerlRegEx

4、可以使用了! 直接 uses PerlRegEx 或从 Tool Palette 添加都可以.
    如果不喜欢 Tool Palette 的添加方式可以省略第二步.


计划的学习步骤: 1、正则语法; 2、TPerlRegEx 功能.



//先测试一下:
uses
  PerlRegEx; //uses 正则表达式单元

procedure TForm1.FormCreate(Sender: TObject);
var
  reg: TPerlRegEx; //声明正则表达式变量
begin
  reg := TPerlRegEx.Create(nil); //建立

  reg.Subject := 'sSsS';    //这是要替换的源字符串
  reg.RegEx   := 's';       //这是表达式, 在这里是准备替换掉的子串
  reg.Replacement := '◆';  //要替换成的新串
  reg.ReplaceAll;           //执行全部替换

  ShowMessage(reg.Subject); //返回替换结果: ◆S◆S

  FreeAndNil(reg); //或 reg.Free
end;

posted on 2007-12-21 00:56 万一 阅读(8263) 评论(59)  编辑 收藏 网摘 所属分类: 40.Delphi 与正则表达式

FeedBack:
#1楼 2008-03-01 09:16 迷惑[未注册用户]
nil是不是其他语言里的null啊?博主在么?
  回复  引用    
#2楼 2008-03-01 09:37 万一
null 如果是个指针, 在 Delphi 中对应 nil
null 如果是个值, 在 Delphi 中对应 0

  回复  引用    
#3楼 2008-07-27 14:43 ee[未注册用户]
学习下
  回复  引用    
#4楼 2008-08-12 23:56 欧阳蓝缺      
博主你好!
我对“FreeAndNil(reg); //因为建立时属主给了 nil, 这里没有使用 reg.Free”这行注释有些疑问:
1.为什么因为属主=nil,而没有使用reg.Free释放?
2.如果属主=nil,使用reg.Free会怎样?
3.如果属主<>nil,使用FreeAndNil和.Free有什么区别?(我知道FreeAndNil会将存放实例的变量.Free后:=nil,我现在所有的释放都用的FreeAndNil)

  回复  引用  查看    
#5楼[楼主] 2008-08-13 00:04 万一      
@欧阳蓝缺
如果对象建立是有属主, 将会随属主一同释放.

  回复  引用  查看    
博主你好!
我对“FreeAndNil(reg); //因为建立时属主给了 nil, 这里没有使用 reg.Free”这行注释有些疑问:
1.为什么因为属主=nil,而没有使用reg.Free释放?
2.如果属主=nil,使用reg.Free会怎样?
3.如果属主<>nil,使用FreeAndNil和.Free有什么区别?(我知道FreeAndNil会将存放实例的变量.Free后:=nil,我现在所有的释放都用的FreeAndNil)


对这个我也有疑问,看了楼主的解释还是没有明白。



  回复  引用    
#7楼[楼主] 2008-09-01 10:44 万一      
@学习一下
又看了一下, 觉得是原来的理解有问题, 已修正.

  回复  引用  查看    
万老师你好!
跟着老师学习正则表达示,按以上步骤操作,delphi2009也装上了单元文件,但运行测试时发现不正常,不知是那儿的原因。请老师指点一下,谢谢!
[DCC Error] PerlRegEx.pas(260): E2052 Unterminated string
[DCC Error] PerlRegEx.pas(261): E2010 Incompatible types: 'Char' and 'string'
[DCC Warning] PerlRegEx.pas(367): W1057 Implicit string cast from 'UTF8String' to 'string'
[DCC Warning] PerlRegEx.pas(368): W1057 Implicit string cast from 'UTF8String' to 'string'
[DCC Warning] PerlRegEx.pas(369): W1057 Implicit string cast from 'UTF8String' to 'string'
[DCC Warning] PerlRegEx.pas(370): W1057 Implicit string cast from 'UTF8String' to 'string'
[DCC Warning] PerlRegEx.pas(751): W1057 Implicit string cast from 'UTF8String' to 'string'
[DCC Warning] PerlRegEx.pas(756): W1057 Implicit string cast from 'UTF8String' to 'string'
[DCC Warning] PerlRegEx.pas(760): W1057 Implicit string cast from 'UTF8String' to 'string'
[DCC Warning] PerlRegEx.pas(784): W1057 Implicit string cast from 'AnsiString' to 'string'
[DCC Fatal Error] Unit1.pas(23): F2063 Could not compile used unit 'PerlRegEx.pas'

  回复  引用    
#9楼[楼主] 2008-09-05 13:17 万一      
@靳承柱之靳承柱
在 Delphi 2009 中使用, 肯定要修改头文件.
先等官方升级吧.

  回复  引用  查看    
知道了,万老师,那就先学点别的,等官方做好了,再下载试试。谢谢万老师了。
  回复  引用    
#11楼 2008-09-19 15:42 fancy[未注册用户]
现在下载最新版的好像会出错
[MakeDir Error] 无法创建目录“R:\JGsoft\Bin\D2007”。未能找到路径“R:\JGsoft\Bin\D2007”的一部分。

怎么回事?
D2007+VISTA

  回复  引用    
#12楼 2008-09-19 16:11 guqiu[未注册用户]
@fancy
Options 中设置一下 Directories/Conditionals 选项

  回复  引用    
#13楼 2008-09-19 16:31 fancy[未注册用户]
@guqiu
改完后提示
没有找到pcre3.dll

  回复  引用    
#14楼 2008-09-23 09:45 withy[未注册用户]
freeandnil相当于object.free; object:=nil这两句,因为对象的free方法并不会释放对象指针。
  回复  引用    
#15楼 2008-11-16 17:08 nobird[未注册用户]
没安装delphi的电脑提示缺少pcre3.dll的问题怎么办呢?
  回复  引用    
#16楼[楼主] 2008-11-16 17:36 万一      
@nobird 那只好携带它, 我还没注意这个问题呢. 讨厌携带 dll 的组件. 我刚才落实了一下: 之前的那个版本是可以不带 dll 的, 并且有源码. 现在的版本不行了.
  回复  引用  查看    
'没安装delphi的电脑提示缺少pcre3.dll的问题怎么办呢?'

放在pcre目录下呢,复制到包目录下

  回复  引用    
#18楼[楼主] 2008-11-19 13:23 万一      
@汉字最好
我看了一下 pcre.pas 的源码, 把
pcre.pas、PerlRegEx.pas 和 pcre3.dll 都放在根目录即可.

我看的是 for 2009 版的. 如果是用以前的 for 2006-2007 版本, 可以不带 dll.

  回复  引用  查看    
万老师, 那天我用邮箱发给你的那问题,能帮我看看吗?...... 你有解决的方法吗?
  回复  引用    
看编译原理的正则表达式,看得云里雾里,
现在看这个怎么样

  回复  引用    
#21楼[楼主] 2008-11-19 14:12 万一      
@heyongan
看了, 但没能解决, 问题应该在这句:
Alpha := Round((WidthPen[OldPenWNum-1+i] / PenWidth) * 255);

  回复  引用  查看    
是呀,就在这句,这边设置了透明度,然后遇到线冒叠加,颜色就加深了.....
万老师,GDI+有没有线冒叠加颜色加深的问题解决方案吗,或者说它有提供之类的操作..... 我那还有问题,就是 会出现断断继继的情况,那应该是笔宽落差太大而造成的,但但我笔宽落差用等差数列的方式把它将下来,就这样一个简单的方式,会使运行起来非常占用资源!....... 不知道是否其它可解决方法?。。。。

  回复  引用    
#23楼[楼主] 2008-11-19 14:29 万一      
@heyongan
就本例来讲, 你试过不用线帽吗?

  回复  引用  查看    
试过了,GDI+的一些基本方法都试过了,但还是无法解决,只要一遇到笔迹相交处,颜色就加深了..... 而且我那种做法占用资源很多,而我这边有个软件,就是我发给你的那例子图,它占用资源很少,而且光滑度处理得很好,我仔细看它的笔迹,它也是有设置线冒的!
  回复  引用    
#25楼[楼主] 2008-11-19 14:42 万一      
@heyongan
找时间我再看看.

  回复  引用  查看    
好的, 谢谢万老师!
  回复  引用    
我的D7,用dpk一直没成功,最后用pas安装成功了

并且安装过程还要用到XPMenu,又安装了个XPMenu,不知怎么回事

  回复  引用    
#28楼[楼主] 2008-11-28 11:37 万一      
@南山古桃 我没再 d7 下用过, 所以说不好. 当时是在 2007 下学的, 当时没使用安装, 复制了那几个文件, 设置了一下路径就开始了.
  回复  引用  查看    
复制了那几个文件, 设置了一下路径就开始了.

强大的万一兄

  回复  引用    
#30楼[楼主] 2008-11-28 13:49 万一      
@南山古桃
按照旧版: 只需要 PerlRegEx.pas、CHelpers.pas 和 PCRE 文件夹
按照新版: 只需要 PerlRegEx.pas、pcre.pas 和 PCRE 文件夹


  回复  引用  查看    
--引用--------------------------------------------------
万一: @nobird
那只好携带它, 我还没注意这个问题呢. 讨厌携带 dll 的组件.

我刚才落实了一下:
之前的那个版本是可以不带 dll 的, 并且有源码.
现在的版本不行了.
--------------------------------------------------------

哪个版本可以不带dll万一兄?
我也碰到了这个问题?

  回复  引用    
#32楼[楼主] 2008-11-28 16:03 万一      
@南山古桃
给我个 mail : wy132435@gmail.com, 我发你个.
不过没有 2009 版的, 只适应与 2007 之前的版本.

  回复  引用  查看    
#33楼 2008-12-11 14:01 水沐[未注册用户]
把PerlRegExD2007.dproj里的这些地方改掉,一般都没有R盘的,
<DCC_DcuOutput>R:\JGsoft\Bin\D2007</DCC_DcuOutput>
<DCC_ObjOutput>R:\JGsoft\Bin\D2007</DCC_ObjOutput>
<DCC_HppOutput>R:\JGsoft\Bin\D2007</DCC_HppOutput>
<DCC_BplOutput>g:\JGsoft\Packages</DCC_BplOutput>
<DCC_DcpOutput>g:\JGsoft\Packages</DCC_DcpOutput>
然后会提示找不到pcre.dll找到他复制到bin目录就ok了

  回复  引用    
#34楼 2008-12-14 04:17 afans[未注册用户]
请教博主一个正式表达式,如何删除delphi中的注释,包括{}风格的,区分{$}预编译指定;(**)风格;//风格,区分s = 'http://www.sina.com' 及s = 'love // for you'这样的.
  回复  引用    
#35楼[楼主] 2008-12-14 10:38 万一      
@afans
我现在 2009 没用上表达式组件, 暂时没法测试.
自己再想想办法, 这应该是最简单的了.

  回复  引用  查看    
#36楼 2009-01-01 16:33 huiziforever      
哇~你好牛哦!能不能给我写一个自定义的类啊!类里面要包括数据的属性,父类,子类,顺序,方法,重载,覆盖,调用~能尽快回复不,我急用啊!
  回复  引用  查看    
#37楼 2009-01-01 16:34 huiziforever      
哦!忘了,实现部分也要哦~
  回复  引用  查看    
#38楼 2009-01-02 22:36 huiziforever      
万老师啊!帮个忙啊!我真的有急用~
  回复  引用  查看    
#39楼[楼主] 2009-01-02 22:48 万一      
@huiziforever
说说你的详细要求.

  回复  引用  查看    
#40楼 2009-01-24 18:14 岛主[未注册用户]
王老师 我用D2007写的程序在别的机器上不能运行,提示 rtl100.bpl没找到,不知如何解决。
  回复  引用    
#41楼 2009-01-24 18:35 岛主[未注册用户]
抱歉,纠正下

是万老师。

  回复  引用    
#42楼[楼主] 2009-01-24 18:40 万一      
@岛主
这个不好说, 那要看什么程序.

  回复  引用  查看    
#43楼 2009-01-24 21:26 岛主[未注册用户]
就是个用了个正则库 PerlRegEx

也选了‘build with runtime packages’

  回复  引用    
#44楼[楼主] 2009-01-24 21:38 万一      
@岛主
那个 build with runtime packages 不要选, 如果没有非常特殊的需要, 你可以永远不选.

另外, 使用随 Delphi 2009 发布的 PerlRegEx 版本, 需要携带一个 dll(具体可以看看上面的评论);
不过之前的有些版本是可以不需要 dll 的.

  回复  引用  查看    
#45楼 2009-01-24 21:49 岛主[未注册用户]

感谢万老师的火速回复!

选择 “build with runtime packages”不是可以让exe文件更小么?

另我用的perlregex 是要带pcre3.dll的,你说不带, 搞不懂了。

  回复  引用    
#46楼[楼主] 2009-01-24 21:54 万一      
@岛主
选择 build with runtime packages 可以让 exe 更小, 但同时必须携带的 bpl 更大.

现在的 perlregex 是要带 pcre3.dll.

  回复  引用  查看    
#47楼 2009-01-24 22:05 岛主[未注册用户]
@万一

照您说的就没有问题了, 感谢万老师。


  回复  引用    
#48楼 2009-01-24 22:07 岛主[未注册用户]
那也就是说用D写的程序至少都是几百K了么?
  回复  引用    
万老师好,在delphi7下,每次运行时都会指到begin处,向下运行就出错,为什么呢?
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);

  回复  引用    
#50楼 2009-02-27 00:08 ebcg[未注册用户]
--引用--------------------------------------------------
南山古桃: --引用--------------------------------------------------
万一: @nobird
那只好携带它, 我还没注意这个问题呢. 讨厌携带 dll 的组件.

我刚才落实了一下:
之前的那个版本是可以不带 dll 的, 并且有源码.
现在的版本不行了.
--------------------------------------------------------

哪个版本可以不带dll万一兄?
我也碰到了这个问题?

--------------------------------------------------------
现在的版本也可不带DLL.打开源码修改{$DEFINE PCRE_LINKDLL}

  回复  引用    
#51楼 2009-02-27 00:15 ebcg[未注册用户]
PerlRegEx.pas 内
'?: 改为 #$B7:
另一处改为#$00B7:

  回复  引用    
#52楼[楼主] 2009-02-27 09:19 万一      
@ebcg
谢谢 ebcg, 你提供的信息很重要.

  回复  引用  查看    
#53楼 2009-03-20 14:28 steamx      
请问一下为什么我用d7安装的时候没问题,Tool Palette 的列表中也已经有了 TPerlRegEx, 在 JGsoft 组.
另外在环境变量中也设置了Library path ,可是关掉d7之后,重新打开时,却报错误: 【没有找到 pcre3.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题】

  回复  引用  查看    
#54楼[楼主] 2009-03-20 14:36 万一      
@steamx
你看看 #51 楼的办法行吗(我还没试过), 最好别用那个 dll, 不然分发时有麻烦.

  回复  引用  查看    
#55楼 2009-03-20 14:42 steamx      
谢谢你的回复,不过我按51楼的方式去找那个pas文件,没有他说的【'?: 】.

  回复  引用  查看    
#56楼 2009-03-31 00:18 G00X[未注册用户]
按照万老师的方法装了一下,文件夹有 PerlRegExD7.dpk类似的文件,按照文件名,应该D7装PerlRegExD7.dpk,不过我D7.D2006都尝试装,虽然提示失败,且没找到[这时在 Tool Palette 的列表中已经有了 TPerlRegEx, 在 JGsoft 组.]

不过还是能用了.
期间,出现提示pcre3.dll找不到,但发现EXE还是生成了,把pcre3.dll和EXE都一目录,EXE能运行,所以只要pcre3.dll放到准确位置就能正常编译,可惜我不知道是哪个目录~

  回复  引用    
#57楼 2009-03-31 00:21 G00X[未注册用户]
经过测试,发现,放在程序所在目录即可.如我的是在D:\Program Files\Borland\Delphi7\Projects
  回复  引用    
#58楼 2009-04-14 15:08 heyd[未注册用户]
请问用TPerlRegEx的时候发现过“Stack overflow”,应该怎么解决呢?
问题由来:
正则表达式1:begin([\s\S])*end
正则表达式2:begin[\s\S]*end
在进行匹配时,当匹配字符串较小时,两个表达式都能正确匹配,但是当匹配字符串较大时,比如20000个以上,正则表达式1就不能匹配了,报“Stack overflow”错,在pcre3.dll的pcre_exec里面报错,这是怎么回事。仅仅是多了一个括号,
因为可能在正则表达式1的括号内再加上一些限制条件,所以括号应该是必须的。
比如:begin((?!(begin|end))[\s\S])*end
谢谢!

  回复  引用    
#59楼 2009-04-14 15:59 heyd[未注册用户]
顺便请问,关于Delphi的正则表达式控件还有哪些呢?开源的有哪些?哪个功能最强大?谢谢!

  回复  引用    
我实在无法理解PerlRegEx作者的做法。象他现在搞成每次要带pcre3.dll的样子,我不如直接用微软RegExp算了。
主菜单->Project->Import type library->在列表中选择"Microsoft VBScript Regular Expressions"
这个东西是随IE安装的,基本上装windows的机子上都有。分发软件的时候可以不用携带。

  回复  引用    
#61楼 2009-07-03 22:38 wuyu[未注册用户]
关于pcre3.dll的问题,在它的官网第二段文字有介绍

There are many PCRE-based VCL components available. Most are free, some are not. Some compile PCRE into a DLL that you need to ship along with your application, others link the PCRE OBJ files directly into your Delphi EXE.

也就是说,除了将dll带着走以外,还可以将pcre目录下那些obj文件一起链接进delphi编译出来的exe文件中。

在pcre.pas文件最前面有这么一些语句

// 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
//{$DEFINE PCRE_STATICLINK}

// Define PCRE_LINKDLL to use pcre3.dll
{$DEFINE PCRE_LINKDLL}

嘿嘿,原来解决起来如此简单,把{$DEFINE PCRE_STATICLINK}和{$DEFINE PCRE_LINKDLL}的注释处理一下就行了。

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1008108




相关文章:

相关链接: