正则表达式有三种形式:匹配、替换和转换。
在表 9-1 中列有三种正则表达式运算符。
接下来对每一个表达式给出详尽解释。
匹配:m/<regexp>/这种形式表明在//内部的正则表达将用于匹配 = ~或 !~左边的标量。为了语法上的简化用/<regexp>/,略去m。
替换:s/<regexp>/<substituteText>/这种形式表明正则表达式<regexp>将 被文本 <substituteText>替换,为了语法的简化用/<regexp>/<substituteText>略 去s。
·转换:tr/<charClass>/<substituteClass>/这种形式包含一系列的字符—/<charClass>—同时把它们替换为<substituteClass>。
注意转换<tr>并不真正是一个正则表达式,但是对于用正则表达式难于处理的数据常使用它来进行操纵。因此,tr/[0-9]/9876543210.组成1223456789,987654321等字符串。
通过使用=~(用英语讲:does,与“进行匹配”同)和!~(英语:doesn't,与“不匹配”同)把这些表达式捆绑到标量上。作为这种类型的例子,下面我们给出六个示例正则表达式及相应的定义:
$scalarName =~ s/a/b; # substitute the character a for b, and return true if this can happern
$scalarName =~ m/a; # does the scalar $scalarName have an a in it?
$scalarName =~ tr/A-Z/a-z/; # translate all capital letter with lower case ones, and return ture if this happens
$scalarName !~ s/a/b/; # substitute the character a for b, and return false if this indeed happens.
$scalarName !~ m/a/; # does the scalar $scalarName match the character a? Return false if it does.
$scalarName !~ tr/0-9/a-j/; # translate the digits for the letters a thru j, and return false if this happens.
如果我们输入像 horned toad =~ m/toad/ 这样的代码,则出现图 9-1 所示情况:
另外,如果读者正在对特定变量 $_ 进行匹配(读者可能在while循环,map或grep中使用),则可以不用!~和=~。因而,以下所有代码都会合法:
my @elemente = (' al' ,' a2' ,' a3' ,' a4' ,' a5' );
foreach (@elements) {s/a/b/;}
程序使 @elements 等于b1,b2.b3,b4,b5。另外:
while(<$FD>) {print if (m/ERBOR/);}
打印所有包含 error 字符串的行:
if (grep(/pattern/, @lines)) {print " the variable \@lines has pattern in it!\n";}
打印所有包含模式pattern内容的行,这直接引入下一原则。
9.3.2 原则2
正则表达式仅在标量上匹配。
注意这里标量的重要性,如果读者试一试如下代码:
@arrayName = (' variablel', 'variable2');
@arrayName =~ m/variable/; # looks for ' variable' in the array? No! use grep instead
那么@arrayName匹配不成功! @arrayName被Perl解释为2,于是这意味着读者在输入:
' 2' =~ m/variable/;
至少讲这不能给出预想的结果。如果读者想这样做,输人为:
grep(m/variable/, @arrayName);
该函数通过@arrayName中的每一个元素进行循环,返回(在标量环境中)匹配的次数,同时在数组环境中返回匹配元素的实际列表。
9.3.3 原则3
对于给定的模式串,正则表达式只匹配最早出现的匹配项。匹配时缺省一次只匹配或替换一次。
这个原则使用称为“回溯”的过程指出如何匹配一个给定的字符串;如果发现了一个局部匹配进而找到使该匹配无效的东西,正则表达式在字符串中“回溯”最小的可能数量,这个数量的字符要保证不丢失任何匹配。
对于理解正则表达式正在做什么,这个原则是最有帮助的一个,同时不需要与Perl一样的形式来理解它正在做什么。假定有如下模式:
' Silly people do silly things if in silly moods'
同时想匹配如下模式:‘
' silly moods'
那么正则表达式引擎匹配silly,接着遇到people的P,至此,正则表达式引擎知道第一个silly不匹配,于是正则表达式引擎移到 P 且继续寻求匹配。它接着遇到第二个silly,于是来匹配moods。然而得到的是字母 t(在thing中),于是移到 things中的 t 处,继续进行匹配。当引擎遇到第三个silly并且尽力匹配moods时,匹配成功,匹配最后完成。所发生的情况如图 9-2 所示。
当我们遇到通配符时回溯将变得更加重要。如果在同一正则表达式中有几个通配符,且所有的通配符交织在一起,那么这里就有病态情形出现,在这种情形下,回溯变得非常昂贵。看如下表达式: :
三种正则表达式形式:匹配、替换和转换
顶一下
(0)
0%
踩一下
(0)
0%
- 上一篇:js为关键词加超级链接
- 下一篇:近期准备修改博客
来源:黑帽网络作者:sunray2008-09-18 22:09浏览:
次
推荐内容
- 节日倒计时JS代码
今天是 SCRIPT LANGUAGE = JavaScript TYPE = text/JavaScript var day = ; var mon...
最近更新
本月好评
- ▪ PHP编码转换函数mb_convert_encoding与iconv的使 - 0805
本月热门
- ▪ PHP编码转换函数mb_convert_encoding与iconv的使 - 0805
随机文章
- ▪ 常用网页使用js技巧收集(200多个) - 1023
- ▪ 被框架后自动转向 - 1023
- ▪ 定时删除自身代码 - 1203
- ▪ 未知尺寸的图片把页面撑破的简单解决办 - 1023
- ▪ dedecms用户评论跳转到文章页面以及游客评 - 1029
- ▪ SupeSite模块参数说明,自定义模型数据调用 - 0518
- ▪ 眼睛随着鼠标转 特效代码包 - 1030
- ▪ 本站修改全记录 Sablog 1.6 - 1120
- ▪ javascript 常用代码大全 - 1003
- ▪ 环绕广告的实现方法 - 1023
