登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: Delphi中使用RegExpr单元进行匹配与替换操作[zt][TRegExpr]     [回主站]     [分站链接]
Delphi中使用RegExpr单元进行匹配与替换操作[zt][TRegExpr]
clq
浏览(359) - 2018-05-21 22:08:56 发表 编辑

关键字: TRegExpr

[2018-05-21 22:20:46 最后更新]

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

https://www.cnblogs.com/djcsch2001/archive/2011/06/03/2072217.html

      在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)表示不区分大小写

 

 
分类: DELPHI
标签: Delphi, 正则表达式


clq  2018-05-21 22:19:50 发表 编辑


下面说一下我自己的一个更复杂的例子:

<a href="{:U('uuuuuuuuaaaa/ss')}"><i class="icon-edit"></i>编辑店铺设置</a> </dd>
要替换成
<a href="{:U('aaa/uuuuuuuuaaaa/ss')}"><i class="icon-edit"></i>编辑店铺设置</a> </dd>

那么就要把 U('aaa/uuuuuuuuaaaa/ss') 分成三截,对于 TRegExpr 来说,语法是将三个部分用 "()" 符号括起来,但这当中本身就有括号,根据正则表达式的语法需要先转换成 "\(" 或者 "\)" 同时这里面还有 "'" 单引号,经过多次测试,这个单引号是不用加转义符号的,所以分割成三部分的匹配语句就是
(:U\(')([A-Za-z0-9_]+\/[A-Za-z0-9_]+)('\))
而要替换成的内容很简单,使用 $1 $2 ... 替换符号就可以了。这里要注意的是,默认的 TRegExpr 中并没有开启替换符号,需要将替换函数的最后一个设置为 true 才可以。所以有以下
$1u$2$3
或者这个例子的
$1aaa/$2$3

还要注意的是匹配语句中的 "/" 要写成 "\/",不过在替换结果表达式中却可以不用。
而 "[A-Za-z0-9_]+" 中的 "+" 号最重要,表示至少有一个字符,而且可以是很多个,语法可见于 http://www.jb51.net/article/97732.htm



总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1