文档章节

perl学习笔记-----------------------(8)

henni_719
 henni_719
发布于 2017/04/22 17:13
字数 1647
阅读 1
收藏 0
正则表达式,在Perl 中通常被称为模式(pattern):某个模板是否匹配某个字符串◆。由于存在无限的字符串,某个给定的模式将这些字符串分两类:一类是能匹配的,一类是不能匹配的。这里没有,或者,大概,几乎那样的匹配:要么匹配,要么不匹配。要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下:
$_ =“yabba dabba doo”;
if(/abba/){
print “It matched!\n”;
}

表达式/abba/将在$_寻找这四个字母。如果找到,则返回true,在本例中,它出现了不止一次,但结果没什么不同。总之,如果找到了,则匹配上;如果没找到,则没匹配上。由于模式匹配通常返回true 或false,因此经常用在if 或while 的条件表达式部分。所有在双引号中的转义字符在模式中均有效,因此你可以使用/coke\tsprite/来匹配11 个字符的字符串coke, tab(制表符),sprite。引入特殊字符,它们被叫做元字符(metacharacters).

点(.)是通配符,它可以匹配任何单个的字符,但不包括换行符(“\n”)。如果只希望点(.)匹配句号,可以使用反斜线。这条规则对Perl 正则表达式中所有元字符均有效:元字符前使用反斜线将使它变成普通的字符。如,模式/3\.14159/中的点(.)即不是通配符。

反斜线是第二个元字符。如果需要真正的反斜线,需要重复使用两个反斜线,这和Perl 中其它情况下是一样的。星号(*)表示匹配前一项0次或者多次。。因此,/fred\t*barney/将匹配上fred 和barney之间有任意个制表位(tab)的字符串。可以这样看待星号(*):“前面的东西,重复任意次数,包括0 次”。因此(.*)将匹配任意字符任意多数。将(.*)叫做“任意字符串匹配模式”,因为任意的字符串均能被匹配上(不包括换行符)。

加(+)的意思是可以匹配前面一项的一个或多个:/fred +barney/意思是fred 和barney 之间由空格分开,且只能是空格。(空格不是元字符)。它不会匹配fredbarney,因为加(+)意指一个或多个,因此至少是一个。可以这样看待加(+):“最后一项,(可选的)至少还有一项。”

问号(?),其含义是前面一个项出现一次,或者不出现。也就是说,前面这个项出现1 次或者0 次,此外不会有其它情况。因此,/barm-?bamm/只匹配:bamm-bamm 或bammbamm。括号也是元字符。在数学中,括号(())用来表示分组。模式/(fred)+/能匹配上像fredfredfred 这样的字符串,这更可能是你所希望的。那么模式/(fred)*/呢?它将匹配上像hello,world 这样的字符串。

星号(*)意指匹配上0 次或者多次fred。当为0 时,那什么字符串都能被匹配上。这个模式能匹配上任何字符串,甚至是空串。竖线(|),在这种用法中通常被读作“或(or)”,意思是匹配左边的或者右边的。如果竖线左边没有匹配上,则匹配右边。因此,/fred|barney|betty/将匹配出现过fred,或者barney,或者betty 的字符串。

书写像/fred( |\t)+barney/这样的模式,它将匹配fred,barney 以及中间由空格,制表符(tab),或者二者混合所组成的字符串。加(+)是指重复1 次或多次;每重复一次,( |\t)则有可能匹配一个空格,或者一个制表符。但fred 和barney之间这些字符中(空格,制表符)的其中之一必须出现一次。如果希望fred 和barney 之间的字符是一样的,可以将模式写成/fred( +|\t+)barney/。在本例中,分隔符必须全是空格或者全是制表符。

模式/fred (and|or) barney/能匹配如下两种字符串:fred and barney, fred or barney。字符类,是方括号[]中的一列字符,可以匹配上括号内出现的任意单个字符。它匹配一个字符,但这个字符可以是列中的任意一个。字符类[abcwxyz]可以匹配上括号内七个字母中的任意一个。为了方便,我们可以使用连字号(-)来表示某个范围的字母,因此上例也可以写做[a-cw-z]。

字符类前使用符号^将取此字符类的补集。也就是说,[^def]]将匹配上这三个字符中之外的任意单个字符。[^n\-z]将匹配上n, -, z 之外的任何字符。(连接符(-)前面使用反斜线的原因是,它在此字符类中有特别的含义(表示字符的范围)。任何数字的类,[0-9],可以被简写为:\d。

\w 被称作“word’字符:[A-Za-z0-9_]。如果你的“words”由通常的字母,数字,下划线组成,那你将非常喜欢它。\w 不能匹配单词,而只能匹配单个字符。为了匹配整个单词,需要后接加号。模式/fred \w+ barney/将匹配fred,空格,一个“单词(word)”,然后是空格和barney。因此,如果fred 和barney 之间有一个单词◆,由单个空格分隔开,它将能匹配上。

\s 对于匹配空白(whitespace)将非常方便。它等价于[\f\t\n\r ],其含5 个空白字符:格式符(form-feed);制表符(tab),换行符,回车,以及空格符。\s 匹配此类中的单个字符,如果使用\s*将匹配任何个数的空白(包括没有),或者\s+匹配一个以上的空白(事实上,很少见到单独使用\s,而不使用任何的数量词(*, +))。

[^\d], [^\w], 和[^\s],其含义分别是,非数字的字符,非word(记住我们对word 的定义)的字符,和非空白的字符。也可以使用它们对应的大写形式:\D, \W, \S 来完成。它们将匹配它们对应的小写形式不能匹配上的字符。另一个类字符[\d\D],它的意思是任何数字,和任何非数字,则意指任何字符。这是匹配所有字符的一种通用方法,甚至包括换行符,而点(.)匹配除换行符以外的任何字符。而[^\d\D]则完全没用,因为它匹配既非数字也非非数字的字符,那什么也不是。

© 著作权归作者所有

共有 人打赏支持
henni_719
粉丝 2
博文 466
码字总数 343938
作品 0
信阳
QA/测试工程师
私信 提问
Per学习笔记[3]

Per学习笔记 1.子程序 (1)子程序的定义可以在程序的任意位置,且不需要在定义之前有任何声明。 (2)子程序的定义是全局的,可以在子程序中使用全局变量。 (3)所有的Perl 子程序都会返回值,在P...

wbf961127
2017/11/12
0
0
xtrabackup学习笔记

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/tarball/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz yum -y install perl perl-devel libaio liba......

glassboy2009
2017/06/06
0
0
语言学习读书笔记PHP和asp.net编程语言哪个更有前途?

编程语言一直是学习计算机编程门专业的热门讨论话题,而我也选择了这个专业,入学一年了,马上面临着语言的选择问题,业余我需要选择一门编程语言作为重点研究对象,那么问题来了:到底是选择...

原创小博客
2018/05/30
0
0
Perl学习笔记[2]

1.数组和列表:数组是由括号括起来的且其元素由逗号分隔开的列表。 (1)数组和列表的第一个索引是0,每次按1递增。 (2)数组和列表中的每一个元素都是一个独立的标量值,这些标量值的类型是...

wbf961127
2017/11/12
0
0
为 Java 程序员准备的 10 分钟 Perl 教程

这10分钟教程并不是Java和Perl的比较。目标是探索作为Java开发人员如何快速学习Perl。以下是一些从我的角度来看的关键笔记。 1.从基础开始 不像java,Perl不需要“main”方法作为入口点。要运...

oschina
2013/11/08
7.6K
17

没有更多内容

加载失败,请刷新页面

加载更多

Java并发编程

并发与并行 并发指的是同时应对多个事件的能力,并行指的是同时做多件事的能力。 位级并行:32位计算机能够同时处理32位数运算,而8位计算机却要进行多次运算。 指令级并行:表面上看cpu是串...

春哥大魔王的博客
41分钟前
3
0
js数组遍历和对象遍历

数组遍历 for for(var i=0,len=arr.length;i<len;i++){console.log(arr[i]);} forEach - ES5语法,性能比for弱,不能使用break终止循环,不能使用return arr.forEach(function(item,inde......

祖达
今天
3
0
Spring "reg:zookeeper" 的前缀 "reg" 未绑定等类似问题解决方案。

今天同事遇到一个Spring启动加载配置文件时,不识别reg:zookeeper标签的问题。 我查看配置,发现是Spring配置文件的头部没有引入reg标签的命名空间,具体如下图: 所以,以后遇到类似的标签未...

花漾年华
今天
2
0
阿里云领衔云市场

近期,2018年Q4及全年的全球云基础设施服务市场数据新鲜出炉,发布方是美国市场研究机构Synergy Research Group。这个机构是专做电信网络市场情报的公司,成立于1999年,每年都会公布各大公有...

linuxCool
今天
2
0
C++友元函数和友元类(C++ friend)详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书...

shzwork
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部