加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式学习笔记

发布时间:2020-12-13 22:08:03 所属栏目:百科 来源:网络整理
导读:1,在使用大括号时{},比如1-2次,{1,2};应该是先匹配2次,然后再匹配1次的。 比如 aaa; 使用规则a{1,2},替换为‘我’的话,出来的是,我,我;而不是,我,我,我; 2,或者用|,*={0,} ?={0,1} +={0,1}; 3,[A-z] ; 就包括了从A-Z ,a-z; ASCII 码表记熟

1,在使用大括号时{},比如1-2次,{1,2};应该是先匹配2次,然后再匹配1次的。 比如 aaa; 使用规则a{1,2},替换为‘我’的话,出来的是,我,我;而不是,我,我,我;

2,或者用|,*={0,} ?={0,1} +={0,1};

3,[A-z] ; 就包括了从A-Z ,a-z; ASCII 码表记熟悉;

4,几个范围一起的[C-Do-p0-2]

5[Ci2] 这个里面基本上都是或的关系。 就是是C或者i或者2

6[^Ci2];取反

7 d 所有数字, D 取反

8.w 所有的A-z 0-9 _; W取反

9,一个汉字,相当于2个字符;

10, s 所有的空白

11,.除换行外所有的字符。(只能代表一个字符) 如果想表达任意字符, 可以写成 .*

12.边界字符b 左边是空白 B 不是空白

12行首 ^或者A 行尾 $ 或者Z

13.贪婪算法,非贪婪算法比贪婪算法多加了一个?

14<w*> 与 <.*>的区别 第一个表示<有多个A-z,0-9,_> 字符 而后一个表示,<>有人一个字符,包括<>; 如果加上?表示 > 不在匹配之内。

15,转义符;

16;1引用第一个表达式

reg.Subject := 'one two three ten';
 reg.RegEx  := '(t)(w+)';
 reg.Replacement := '[1-2:]'; // 12 分别引用对应的子表达式;  引用整个表达式
 reg.ReplaceAll;
17; 右边匹配?=; 左边匹配?<=  ;右边不匹配?!  左边不匹配 ?<!
18
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
 	ShowMessage(reg.MatchedExpression); //找到的字符串: Delphi
  ShowMessage(IntToStr(reg.MatchedExpressionOffset)); //它所在的位置: 10
  ShowMessage(IntToStr(reg.MatchedExpressionLength)); //它的长度: 6
Inc(num); end; ShowMessage(IntToStr(num)); //6 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'; //这个表达式有两个子表达式构成
  ShowMessage(reg.SubExpressions[0]); //将分别显示: A1111 BB222 CCC33 DDDD4
  ShowMessage(reg.SubExpressions[1]); //将分别显示: A BB CCC DDDD
  ShowMessage(reg.SubExpressions[2]); //将分别显示: 1111 222 33 4

  {另外:
   reg.SubExpressionCount   是子表达式的个数;
   reg.SubExpressionLengths[n] 是第 n 个表达式返回的字符串的长度;
   reg.SubExpressionOffsets[n] 是第 n 个表达式返回的字符串在源字符串中的位置
  }

//提取子表达式匹配到的内容
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.SubExpressions[0]); //将分别显示: A1111 BB222 CCC33 DDDD4
  ShowMessage(reg.SubExpressions[1]); //将分别显示: A BB CCC DDDD
  ShowMessage(reg.SubExpressions[2]); //将分别显示: 1111 222 33 4

  {另外:
   reg.SubExpressionCount   是子表达式的个数;
   reg.SubExpressionLengths[n] 是第 n 个表达式返回的字符串的长度;
   reg.SubExpressionOffsets[n] 是第 n 个表达式返回的字符串在源字符串中的位置
  }
 end;

 FreeAndNil(reg);
end;

//设定搜索范围: Start、Stop
var
 reg: TPerlRegEx;
begin
 reg := TPerlRegEx.Create(nil);

 reg.Subject := 'ababab';
 reg.RegEx  := 'ab';
 reg.Replacement := '◆';

 reg.Start := 1;
 reg.Stop := 2;
//下面四行程序,相当于 reg.ReplaceAll;
 while reg.MatchAgain do
 begin
  reg.Replace;
 end;
 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;


//提取子表达式匹配到的内容
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.SubExpressions[0]); //将分别显示: A1111 BB222 CCC33 DDDD4
  ShowMessage(reg.SubExpressions[1]); //将分别显示: A BB CCC DDDD
  ShowMessage(reg.SubExpressions[2]); //将分别显示: 1111 222 33 4

  {另外:
   reg.SubExpressionCount   是子表达式的个数;
   reg.SubExpressionLengths[n] 是第 n 个表达式返回的字符串的长度;
   reg.SubExpressionOffsets[n] 是第 n 个表达式返回的字符串在源字符串中的位置
  }
 end;

 FreeAndNil(reg);
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读