正则表达式学习笔记
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 2ShowMessage(reg.MatchedExpression); //找到的字符串: Delphi ShowMessage(IntToStr(reg.MatchedExpressionOffset)); //它所在的位置: 10 ShowMessage(IntToStr(reg.MatchedExpressionLength)); //它的长度: 6Inc(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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |