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

Perl笔记:06、正则表达式

发布时间:2020-12-16 00:07:26 所属栏目:大数据 来源:网络整理
导读:什么是正则表达式 正则表达式在perl又称作模式,是一个匹配(或不匹配)某字符串的模板 使用简易模式 如果模式匹配的对象是$_的内容,只要把模式写在一对反斜线(/)中就可以了,如下所示: $_ = "yabba dabba doo" ; if ( /abba/ ) { print "It matched! n "

什么是正则表达式

正则表达式在perl又称作模式,是一个匹配(或不匹配)某字符串的模板

使用简易模式

如果模式匹配的对象是$_的内容,只要把模式写在一对反斜线(/)中就可以了,如下所示:

$_ = "yabba dabba doo" ;
if ( /abba/ ) {
print "It matched!n" ;
}

表达式/abba/会在$_中寻找这4个字符组成的串,如果找到就返回真,这里会找到不止一个字符串,但这并不是关键,只要曾经找到过,匹配结果就为真,否则为假。

所有在双引号圈引的字符串中使用的技巧(尤其是正斜线转义)都可以在模式串里使用。因此/caketsprite/这个模式会匹配cake一个制表符和sprite这11个字符。

关于元字符

所谓的元字符就是在正则表达式中表达的特殊含义

点号(.)是任何单字符的通配符,当然换行(也就是n)除外。点号只能用来匹配一个字符。如果要匹配点号怎么办呢?使用反斜线()来转移点号即可。反斜线是我们遇到的第二个元字符,在以后的文章中会陆续介绍更多的元字符。

简单的量词

*(星号):匹配前面的内容0次或多次。.*会匹配任意字符无数多次,我们经常戏称.*为捡破烂模式,因为他能通吃所有的字符串。

+(加号):匹配前面的内容1次或多次。把加号想成“算上刚才说的,再加上任意次重复”

?(问号):匹配前面的内容0次或1次。这可以理解为“刚才所说的,有没有都行”

因为这三个量词指定了前一个条目重复出现的次数,所以它们都必须接在某个东西之后。

模式分组

在数学中,圆括号((),或称为小括号)用来分组。因此,圆括号也是元字符。如:模式/fred+/会匹配像fredddddddd这样的字符串,可是这种字符串实际上不常出现。不过,模式/(fred)+/会匹配像fredfredfred这样的字符串,这可能才是你想要的。那么,模式/(fred)*/又如何呢?他会匹配像Hello,world这样的字符串。

圆括号同时也使得部分字符串重新引用称为可能。我们可以用反向引用来引用圆括号中(的模式所)匹配的文字。1、2这样的写法就是在使用反向引用。而斜线后面的数字和括号的组号匹配。

使用圆括号包围的点号可以匹配任何非回车字符。我们可以用如下程序反向引用刚刚匹配的字符1:

$_ = "abba" ;
if ( /(.)1/ ) { # 同 'bb' 相匹配
print "It matched same character next to itself!n" ;
}

(.)1表明需要匹配连续出现的两个同样的字符。(.)会首先匹配a,但是在匹配反向引用的时候就会发现下一个字符不是a,导致匹配失败。perl会跳过这个字符,用(.)来匹配下一个字符b,在匹配反向引用的时候会发现下一个字符也是b,这样就构成了成功的匹配。
反向引用不必总是附在相应的括号后面。下面的模式会匹配y后面的四个连续的非回车字符,并且用1在d字符之后重复这4个字符:

$_ = "yabba dabba doo"
if ( /y(....) d1/ ) {
print "It matched the same after y and d!n" ;
}

也可以用多个括号来分成多组,每组都可以有自己的反向引用。我们可以用括号定义一个非换行字符的组,然后再跟一个非欢呼字符的组。然后用反向引用2和1来构成又去的回文模式,比如abba:

$_ = "yabba dabba doo"
if ( /y(.)(.)21/ ) { # 同 'abba' 相匹配
print "It matched the same after y and d!n" ;
}

Perl 5.10 有一种新的反向引用写法。不再只是简单地用反斜线和组号,而是用了g{N}这种写法。其中N是想要反向引用的组号。在刚才的例子中使用这种新写法会更加清晰:

$_ = "aa11bb"
if ( /(.)g{1}11/ ) {
print "It matched!n" ;
}

用g{N}写法的额外好处是,我们可以使用负数。相比绝对位置的反向引用,相对反向引用会更加有趣。这样我们可以用-1来表达刚才的模式:

择一匹配

竖线(|)通常可以读成“或”,意思是左边匹配或者右边匹配都行。也就是说如果左边的模式匹配失败了,还可以用右边的再试试。

字符集

字符集是指一串可能出现的字符集合,通过写在方括号([])内来表示。它只能匹配单个字符,但可以是字符集里列出的任何一个。
●[a-zA-Z] 匹配一个字母,大小写均可
● [0-9] 匹配一个数字
●[^abc] 匹配除了a或b或c之外的所有字符

字符集简写

[0-9] 等同于 d

[A-Za-z0-9_] 等同于 w
当然,w并不会匹配一个单词,它只会匹配单词字符集里的一个字符。虽然如此,要匹配完整的单词时,只要使用加号修饰符就行了。像/fred w+ barney/这样的模式,会匹配fred、一个空格、一个单词再接一个空格与barney。也就是说,如果在fred与barney之间有一个两边用空格隔开的单词,就会被这个模式匹配。

[ftnr ] 或者说是 空白 等同于 s
也就是说,它等于是包含了5种空白的字符集:换页、制表、换行、回车以及空格。和之前其他的简写一样,s只会匹配字符集里的某个字符。因此。比较常见的做法是使用s*来匹配任意数目的空白(也包括了零个空白),或用s+来匹配一个以上的空白字符。

反义简写

有些时候只是为了获得以上几种简写的反义,而必须写出类似[^d]、[^w]或是[^s]这样的模式,来表示一个非数字、非词或者非空白字符。其实他们的大写版本就是用来完成这种任务的:也就是DW或者S。这些大写版本能匹配相应小写版本范围以外的字符。

这些简写既可以作为模式里独立的字符集,也可以作为方括号里字符集的一部分。也即是说,/[dA-Fa-f]+/可以用来匹配十六进制数字,十六进制表示法使用了ABCDEF(或abcdef)作为额外的数字。

(编辑:李大同)

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

    推荐文章
      热点阅读