您的位置:首页 > 编程语言 > Delphi

Delphi中使用RegExpr单元进行匹配与替换操作

2011-06-03 21:14 495 查看
在Delphi本身不支持正则表达式,但是有许多第三方软件提供了相关组件,通常的有TPerlRegEx和RegExpr,可以在http://RegExpStudio.com中下载此模块,使用时无需安装只要在工程的路径中的search项指定即可(Projects->Options的Directories/Conditions的search项)

下面为设计的窗体:



其中匹配和替换的代码如下

//匹配

procedure TForm1.Button1Click(Sender: TObject);
var
Rgr: TRegExpr;
begin
Rgr := TRegExpr.Create;
Rgr.Expression := ':(\S+),'; //输入333 :1, :3, 输出333 "1" "3"

Edit2.Text := Rgr.Replace(Edit1.Text, '"$1"', True); //最后一个参数必须指定为True,否则不按组匹配,会得到333 "$1" "$1"

Rgr.Free;
end;

//替换,将:xxx,替换为"xxx"

procedure TForm1.Button2Click(Sender: TObject);
var
Rgr: TRegExpr;
begin
Rgr := TRegExpr.Create;
Rgr.Expression := ':(\S+),'; //输入333 :1, :3, 输出 1 3
try
if Rgr.Exec(Edit1.Text) then
repeat
Edit2.Text :=Edit2.Text+' '+Rgr.Match[1]; //Match[1]改为Match[0]后输出 :1 :3
until not Rgr.ExecNext;
finally
Rgr.Free;
end;
end;

end.

问题1:

如果我想匹配 AAA :B, :"C", :D, :"E", 然后将:B, :D,替换为:"B", :"D", 该如何实现呢?

解决方法:

1.字符中的:B, 和:D, ,可以用'(:)(\w+)(,)',共分为三个组,分别为$1,$2,$3;

2.替换用Rgr.Replace(Edit1.Text, '$1"$2"$3', True);

这样又会产生新的问题,即对于汉字无法替换,如AAA :B, :"C", :我们, :"E", 应用上面的规则只能替换为

AAA :"B", :"C", :我们, :"E",所以此处替换规则应该是

(1)以:号开始

(2)以,号结束

(3)中间为非"号的字符

新的匹配规则为 用'(:)([^"]+)(,)'代码为:

procedure TForm1.Button2Click(Sender: TObject);
var
Rgr: TRegExpr;
begin
Edit2.Text := '';
Rgr := TRegExpr.Create;
//Rgr.Expression :='(:)(\w+)(,)'; //不能匹配汉字
Rgr.Expression := '(:)([^"]+)(,)'; //(:)对应$1 (\S+)对应$2 (,)对应$3
Edit2.Text := Rgr.Replace(Edit1.Text, '$1"$2"$3', True);
Rgr.Free;
end;


问题2:

不分大小写的匹配, 该如何实现呢?比如我想匹配aAA或aAa

解决方法:

可用 Rgr.Expression := '(?i)(aA)'; //(?i)表示不区分大小写
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: