随笔 - 1290  文章 - 26 评论 - 3119 trackbacks - 181

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

随笔分类(1439)

随笔档案(1244)

积分与排名

  • 积分 - 824343
  • 排名 - 19

最新评论

阅读排行榜

60天内阅读排行

//查找是否存在
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 万一 阅读(1587) 评论(6)  编辑 收藏 网摘 所属分类: 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.

  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-09-02 18:01 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: