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

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

随笔分类(1869)

随笔档案(1584)

积分与排名

  • 积分 - 1724486
  • 排名 - 10

最新评论

//查找是否存在
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) //2 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 := 0; while reg.MatchAgain do //MatchAgain 是下一个 begin ShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 7 3 2 Inc(num); end; ShowMessage(IntToStr(num)); //6 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 := 0; 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)); //6 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;
posted on 2007-12-21 17:30 万一 阅读(2547) 评论(7)  编辑 收藏 网摘 所属分类: 40.Delphi 与正则表达式

FeedBack:
最后面那个 //目标字符串的位置与长度
//找到的字符串: 2007


应该是 Delphi吧

  回复  引用    
#2楼[楼主] 2008-09-02 18:00 万一      
@外来天客
是的, 我改下.
谢谢.

  回复  引用  查看    
#3楼 2008-11-12 06:15 dggdsm[未注册用户]
万老师:
我想在通过MatchedExpressionOffset,MatchedExpressionLength这两个属性在memo或richedit中把匹配到的文本高亮显示出来,代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TPerlRegEx;
begin
try
reg := TPerlRegEx.Create(nil);

reg.Subject := UTF8Encode(Memo1.Lines.Text);
reg.RegEx := UTF8Encode(Edit1.Text);

Memo2.Lines.Clear;
while reg.MatchAgain do //MatchAgain 是下一个
begin
memo1.SetFocus;
memo1.SelStart := reg.MatchedExpressionOffset-1;
memo1.SelLength := reg.MatchedExpressionLength;
Memo2.Lines.Add(reg.MatchedExpression);
end;
finally
FreeAndNil(reg);
end;
end;

但是发现在中英混杂的情况下或只有中文的情况下,匹配到的结果和在memo(或richedit)高亮显示的文本不一致。

初步断定TPerlRegEx的MatchedExpressionOffset,MatchedExpressionLength这两个属性的值都是以单字节为标准的,而在memo(或richedit)中无论英文或中文都是当作一个字节来对待的(Unicode?widestring?),所以才导致上述情况的出现。

请问万老师此问题能否解决?抑或要达到此目的还有更好的办法?

谢谢

  回复  引用    
#4楼[楼主] 2008-11-12 10:06 万一      
@dggdsm
这是对中文支持的问题, 你在 2009 下试过了吗?
我正准备试试.

  回复  引用  查看    
#5楼 2008-11-12 20:46 dggdsm[未注册用户]
这段代码就是在D2009下试验的。有一个解决的办法,不过认为还有更好的解决办法,请万老师指点。我的代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
reg: TPerlRegEx;
s, t: string; //如果在D2007中,应为widestring;
begin
try
reg := TPerlRegEx.Create(nil);

reg.Subject := UTF8Encode(Memo1.Lines.Text);
reg.RegEx := UTF8Encode(Edit1.Text);

Memo2.Lines.Clear;
while reg.MatchAgain do //MatchAgain 是下一个
begin
memo1.SetFocus;
//memo1.SelStart := reg.MatchedExpressionOffset;
//memo1.SelLength := reg.MatchedExpressionLength;
s := Copy(reg.Subject,1,reg.MatchedExpressionOffset-1);
t := reg.MatchedExpression;
memo1.SelStart := Length(s);
memo1.SelLength := Length(t);

//ShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 7 3 2
//Memo2.Lines.Add(inttostr(reg.MatchedExpressionOffset) + ' ' +inttostr(reg.MatchedExpressionLength));
//Memo2.Lines.Add(inttostr(Memo1.SelStart) + ' ' + inttostr(Memo1.SelLength));
//Memo2.Lines.Add(s);
Memo2.Lines.Add(reg.MatchedExpression);
//Inc(num);
end;
finally
FreeAndNil(reg);
end;
end;

另:
万老师使用过“Delphi高级正则引擎DIRegEx v4.3完整源码(d4/d11)”吗?网友们说不错。不过该控件虽然说有源码,但是关键的单元是以dcu形式提供的,安装后提示为为注册版本,请问万老师能不能找到关键单元的crack?

我的邮箱为:dggdsm@tom.com

谢谢

  回复  引用    
#6楼[楼主] 2008-11-12 20:58 万一      
@dggdsm
我没接触过 DIRegEx.

  回复  引用  查看    
这个也窃走了

^_^

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 1009482




相关文章:

相关链接: