官方网站: 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); //因为建立时属主给了 nil, 这里没有使用 reg.Free
end;

字串的绝对匹配用法

procedure TForm1.Button1Click(Sender: TObject);
begin
with PerlRegEx1 do begin
RegEx:=Edit1.Text;
Subject:=Edit2.Text; //匹配属生的RegEx与Subject
if Match then ShowMessage('Match') else ShowMessage('Not Match');
end;
end;

字串替换的用法

with PerlRegEx1 do begin
Subject := 'Bill loves Hillary';
RegEx := 'Hillary';
Replacement := 'Monica';
if Match then Replace;
ShowMessage(Subject); // "Bill loves Monica"
end;

任意匹配

with PerlRegEx1 do begin
Subject:='linux';
RegEx := 'Windows|Linux'; // Matches 'Windows' or 'Linux', whichever comes first
if Match then Label1.Caption := MatchedExpression + ' rulez!';
end;
-------------------
Option->CaseLess->True->不区分大小写,否则区分大小写

字符匹配

with PerlRegEx1 do begin
Subject := 'Rating: AAA';
RegEx := 'A+'; // Matches the first occurence of 'A', including any A's that may follow right after it
if Match then Label1.Caption :=
'You have been rated with ' + IntToStr(MatchedExpressionLength) + 'A''s'
else
Label1.Caption := 'You have a poor rating';
end;
只要出现A就匹配成功!
______________________________
取得匹配字串前面的字串,当也可以取得后面的字串
----------------------------------
with PerlRegEx1 do begin
Subject:='HaHa Bye Hei Hei';
RegEx := 'Bye';
if Match then Label1.Caption := 'Before typing "Bye", you typed: ' +
Copy(Subject, , MatchedExpressionOffset-);
end;
--------------------------------
第一个字符为大写的匹配方式
---------------------------------
with PerlRegEx1 do begin Subject := 'I like to hang out at Foo bar'; RegEx := '([A-Za-z]+) bar';//([A-Za-z]+) 这个表示第一个字符大写,后面不管 Replacement := ' \1 is the name of the bar I like'; if Match then Replace; ShowMessage(Subject); end; 分裂字串(把一个字串按指定分隔号裂开)
---------------------------------加如文本------
One,Two,Three,Four
你, 我, 他
你们, 我们, 他们
----------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
begin
PerlRegEx1.Subject:=Memo1.Lines.GetText;
PerlRegEx1.RegEx:=',';
PerlRegEx1.Split(Memo2.Lines,);
end;
-----裂开后,每个子字串都占一行-------------
One
Two
Three
Four



你们
我们
他们
----------代码如下-----------------
begin
PerlRegEx1.Subject:=Memo1.Lines.GetText;
PerlRegEx1.RegEx:=',';
PerlRegEx1.Split(Memo2.Lines,);//0表示源字串中的所有子字串
end;
----------------------------------
这个功能在做文本数据库时最好用->把文本裂开后存入数据表中

类的属性与方法

//查找是否存在
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;
//查找是否存在(方法2)
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '\d'; reg.Match; //执行查找 if reg.FoundMatch then //布尔变量 FoundMatch 会告诉我们查找有没有结果
ShowMessage('找到了')
else
ShowMessage('没找到'); FreeAndNil(reg);
end;
//显示找到的第一个
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '\d'; if reg.Match then
ShowMessage(reg.MatchedExpression) //
else
ShowMessage('没找到'); 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 := ;
while reg.MatchAgain do //MatchAgain 是下一个
begin
ShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 7 3 2
Inc(num);
end;
ShowMessage(IntToStr(num)); // 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 := ;
if reg.Match then
begin
repeat
ShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 7 3 2
Inc(num);
until (not reg.MatchAgain);
end;
ShowMessage(IntToStr(num)); // 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;
// MatchedExpression 与 SubExpressions[0]
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.Subject := 'CodeGear Delphi 2007';
reg.RegEx := 'Delphi'; while reg.MatchAgain do
begin
ShowMessage(reg.MatchedExpression); //Delphi; 这是匹配到的内容
ShowMessage(reg.SubExpressions[]); //Delphi; 也可以这样显示匹配到的内容
end;
{
SubExpressions 是一个数组:
SubExpressions[1] 储存第 1 个表达式匹配的内容;
SubExpressions[2] 储存第 2 个表达式匹配的内容;
SubExpressions[n] 储存第 n 个表达式匹配的内容; SubExpressions[0] 储存整个表达式匹配的内容; MatchedExpression 表示的不过是 SubExpressions[0].
} FreeAndNil(reg);
end;
//提取子表达式匹配到的内容
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.Subject := 'abc A1111 BB222 CCC33 DDDD4';
reg.RegEx := '\b([A-D]+)([1-4]+)\b'; //这个表达式有两个子表达式构成 while reg.MatchAgain do
begin
ShowMessage(reg.SubExpressions[]); //将分别显示: A1111 BB222 CCC33 DDDD4
ShowMessage(reg.SubExpressions[]); //将分别显示: A BB CCC DDDD
ShowMessage(reg.SubExpressions[]); //将分别显示: 1111 222 33 4 {另外:
reg.SubExpressionCount 是子表达式的个数;
reg.SubExpressionLengths[n] 是第 n 个表达式返回的字符串的长度;
reg.SubExpressionOffsets[n] 是第 n 个表达式返回的字符串在源字符串中的位置
}
end; FreeAndNil(reg);
end;
//子表达式不能超过 MAX_SUBEXPRESSIONS = 99 个, MAX_SUBEXPRESSIONS 是 TPerlRegEx 的内置常数.
//设定搜索范围: Start、Stop
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.Subject := 'ababab';
reg.RegEx := 'ab';
reg.Replacement := '◆'; reg.Start := ;
reg.Stop := ;
while reg.MatchAgain do
begin
reg.Replace;
end;
ShowMessage(reg.Subject); //返回: ◆abab reg.Subject := 'ababab';
reg.Start := ;
reg.Stop := ;
while reg.MatchAgain do
begin
reg.Replace;
end;
ShowMessage(reg.Subject); //返回: ab◆ab reg.Subject := 'ababab';
reg.Start := ;
reg.Stop := ;
while reg.MatchAgain do
begin
reg.Replace;
end;
ShowMessage(reg.Subject); //返回: abab◆ FreeAndNil(reg);
end;
// Replace
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.RegEx := 'ab';
reg.Replacement := '◆'; reg.Subject := 'ababab';
reg.ReplaceAll;
ShowMessage(reg.Subject); //返回: ◆◆◆ reg.Subject := 'ababab';
//下面四行程序, 相当于 reg.ReplaceAll;
while reg.MatchAgain do
begin
reg.Replace;
end; ShowMessage(reg.Subject); //返回: ◆◆◆ FreeAndNil(reg);
end;
{
ReplaceAll 函数返回的是 Boolean;
Replace 函数返回的是 Replacement 的值, 当然是不能赋值的, 它仅仅是返回值.
}
// Compile、Study
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.RegEx := 'ab';
reg.Options := [preCaseLess];
reg.Compile; {编译表达式}
reg.Study; {Study 方法会检查是否编译, 如果没有编译则执行 Compile} reg.Replacement := '◆';
reg.Subject := 'abAbaB'; reg.ReplaceAll;
ShowMessage(reg.Subject); {返回: ◆◆◆} FreeAndNil(reg);
end; {
编译表达式, 会加快执行速度、降低启动速度;
如果表达式比较复杂而又多次执行, 应该先编译;
编译内容包括表达式选项.
}
// EscapeRegExChars 函数可以自动为特殊字符加转义符号 \
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil); reg.Subject := 'C++Builer';
reg.RegEx := reg.EscapeRegExChars('C+') + '{2}'; {相当于 'C\+{2}'}
reg.Replacement := '◆';
reg.ReplaceAll; ShowMessage(reg.Subject); {返回: ◆Builer} FreeAndNil(reg);
end;
//字符串分割: Split
var
reg: TPerlRegEx;
List: TStrings;
begin
List := TStringList.Create;
reg := TPerlRegEx.Create(nil); reg.Subject := 'aaa,bbb,ccc,ddd';
reg.RegEx := ','; {这里可是运行相当复杂的分割符啊} reg.Split(List,MaxInt); {第一个参数读入的是 Subject; 第二个参数是分成多少份}
{ 输入一个最大整数, 表示能分多少就分多少} ShowMessage(List.Text);
{返回:
aaa
bbb
ccc
ddd
} FreeAndNil(reg);
List.Free;
end;
												

Delphi 正则表达式之TPerlRegEx的更多相关文章

  1. Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数 //字符串分割: Split var   reg: TPerlRegEx;   List: TStrings; ...

  2. Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数 // EscapeRegExChars 函数可以自动为特殊字符加转义符号 \ var   ...

  3. Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile、Study

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile.Study // Compile.Study var   reg: TPerlRegEx; begin   re ...

  4. Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace // Replace var   reg: TPerlRegEx; begin   reg := TPerlRe ...

  5. Delphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start、Stop

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start.Stop //设定搜索范围: Start.Stop var   reg: TPerlRegEx; begin   r ...

  6. Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式 // MatchedExpression 与 SubExpressions[0] var   reg: TPerl ...

  7. Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找 //查找是否存在 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Cre ...

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

    目前主流的delphi下的正则表达式,应该是 PerlRegEx . 官方网站: http://www.regular-expressions.info/delphi.html    直接下载: ht ...

  9. Delphi 正则表达式语法(10): 选项

    Delphi 正则表达式语法(10): 选项 // preCaseLess: 不区分大小写, 相当于其他语言中的 i var   reg: TPerlRegEx; begin   reg := TPe ...

随机推荐

  1. HDU 6038 Function —— 2017 Multi-University Training 1

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  2. xshell如何传输文件【转】

    1.打开xshell工具,连接到服务器. 2.yum安装一款工具. #yum install  lrzsz -y 3.检查是否安装成功. #rpm -qa |grep lrzsz 4.上传文件的执行命 ...

  3. java构造器内部多态方法

    public class TestC { public static void main(String []args) { new Graph(5); }}class Grp{ void draw() ...

  4. configure error libmcrypt was not found解决方法

    安装到mcrypt的时候出现了问题./configure提示出错,首先提示*** Could not run libmcrypt test program, checking why-*** The ...

  5. Python 多进程异常处理

    前言 最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较‘重’的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较‘重’ ...

  6. PHP将mysql数据表转换为excel文件

    测试代码: <?php $DB_Server = "127.0.0.1"; $DB_Username = "root"; $DB_Password = & ...

  7. Python笔记(一)_基础

    数据类型和转换 整型.浮点型.字符串.布尔值 int() 整型转换 float() 浮点型转换 str() 字符串转换 运算符.操作符 算术运算符:+  -  *  /  %  //  ** 赋值运算 ...

  8. Unity获取Android和iOS手机系统电量及网络状况

    最开始考虑使用中间静态链接库来调用手机系统自带的API,但是在研究的过程中发现Android系统将电量等信息记录在了固定的文件中,所以只需要在C#中直接读取就可以而不需要中间库. a.Android版 ...

  9. js获取近十二个月

    1.获取近十二个月 var dataArr = []; var data = new Date(); var year = data.getFullYear(); data.setMonth(data ...

  10. Spring 官方文档笔记---Bean

    In Spring, the objects that form the backbone of your application and that are managed by the Spring ...