DELPHI 用的正则,记录一下  
官方Delphi 学习QQ群: 682628230(三千人)
频道

DELPHI 用的正则,记录一下


 


//查找是否存在

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;


//替换一般字符串

var

reg: TPerlRegEx;

begin

reg := TPerlRegEx.Create(nil);

reg.Subject := '我爱DELPHI, 但Delphi不爱我!';

reg.RegEx   := 'Delphi';

reg.Replacement := '◆';

reg.ReplaceAll;

ShowMessage(reg.Subject); //返回: 我爱DELPHI, 但◆不爱我!          

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;

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_r 与Subexpression_rs[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_r); //Delphi; 这是匹配到的内容

   ShowMessage(reg.Subexpression_rs[0]); //Delphi; 也可以这样显示匹配到的内容

end;

{

Subexpression_rs 是一个数组:

Subexpression_rs[1] 储存第 1 个表达式匹配的内容;

Subexpression_rs[2] 储存第 2 个表达式匹配的内容;

Subexpression_rs[n] 储存第 n 个表达式匹配的内容;


Subexpression_rs[0] 储存整个表达式匹配的内容;


Matchedexpression_r 表示的不过是 Subexpression_rs[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.Subexpression_rs[0]); //将分别显示: A1111 BB222 CCC33DDDD4

   ShowMessage(reg.Subexpression_rs[1]); //将分别显示: A BB CCC DDDD

   ShowMessage(reg.Subexpression_rs[2]); //将分别显示: 1111 222 33 4


   {另外:

     reg.Subexpression_rCount     是子表达式的个数;

     reg.Subexpression_rLengths[n] 是第 n 个表达式返回的字符串的长度;

     reg.Subexpression_rOffsets[n] 是第 n 个表达式返回的字符串在源字符串中的位置

    }

end;


FreeAndNil(reg);

end;


//子表达式不能超过 MAX_SUBexpression_rS = 99 个, MAX_SUBexpression_rS 是TPerlRegEx 的内置常数.


//设定搜索范围: Start、Stop

var

reg: TPerlRegEx;

begin

reg := TPerlRegEx.Create(nil);


reg.Subject := 'ababab';

reg.RegEx   := 'ab';

reg.Replacement := '◆';


reg.Start := 1;

reg.Stop := 2;

while reg.MatchAgain do

begin

   reg.Replace;

end;

ShowMessage(reg.Subject); //返回: ◆abab



reg.Subject := 'ababab';

reg.Start := 3;

reg.Stop := 4;

while reg.MatchAgain do

begin

   reg.Replace;

end;

ShowMessage(reg.Subject); //返回: ab◆ab



reg.Subject := 'ababab';

reg.Start := 5;

reg.Stop := 6;

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;



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.056966066360474 seconds