官方网站: 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. v-show与v-if的区别

    v-show有dom节点像display:none,而v-if隐藏的则没有dom节点.两个共同点都可以显隐

  2. 累加器A与ACC区别

    累加器写成A或ACC在51汇编语言指令中是有区别的. ACC在汇编后的机器码必有一个字节的操作数,即累加器的字节地址E0H,A在汇编后则隐含在指令操作码中.所以在指令中A不能用ACC来替代,而对A的特 ...

  3. linux: 如何查看端口占用?

    查看端口占用 $: netstat -anp | grep 8888 tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 13404/python3 tcp 0 1 172 ...

  4. Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】

    基本认识linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的. 问题场景 ...

  5. laravel 向多视图及所有视图传递数据变量

    向单个视图传递变量 1.使用with()方法 : view('user.lists')->with('title',$title); 2.直接view()传参: view('user.lists ...

  6. 在WSL Ubuntu 下编译UPX详细步骤

    准备环境: 1. sudo apt-get update 2. sudo apt-get clang 3. apt-get install libstdc++-dev Reading package ...

  7. 怎么学习PHP

    学习PHP有半个月了.每天都要打代码and写笔记.学过C和Java,在学习PHP的过程中比较顺利吧 (^-^) 代码打得越多,运行得越多,慢慢得会对程序理解得越深.下面就讲讲我学习PHP的心得.PHP ...

  8. CSS3 3D旋转下拉菜单--兼容性不太好

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. LOJ6682 梦中的数论

    题目 不难发现我们要求的东西是\(\sum_{i=1}^n\binom{\sigma(i)}{2}=\sum_{i=1}^n\frac{\sigma(i)(\sigma(i)-1)}{2}=\frac ...

  10. [Git 系列] WIN7下Git的安装

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/monkey7777/article/details/32155833 1.下载git win7版本号 ...