正则表达式之一:正则表达式漫游
1、正则表达式:
在Perl中常常叫做模式,是一个匹配(或不匹配)某字符串的模板。也就是说,虽然有无限多可能的文本字符串存在,但只要用一个模式就可以将它们干净利落地分成两组:匹配的串与不匹配的串。模式绝对没有仁慈、写意之类的性格,它要么匹配,要么不匹配。
它的任务很简单:查看一个字符串,然后决定匹配或不匹配。
2、使用简易模式
若模式匹配的对象是$_的内容,只要把模式写在一对正斜线(/)中就可以了,如下。
$_="yabba dabba doo"; if(/abba/){ print "It matched!\n";}
批注:表达式/abba/会在$_中寻找这4个字符组成的串,如果找到就返回真,但不管找到几个,所以往往会在if和while的条件表达式里看到它。
3、元字符
点号(.)是任何单字符的通配符,换行(\n)除外;如:/bet.y/ 则betsy、bet=y、bet.y匹配,但bety或betsey不匹配。
在任何元字符前面加上反斜线,就会使它失去元字符的特殊作用。如/3\.14159/ 中匹配的就是.本身。
4、简易的量词
*用来匹配前面的内容0次或多次;
+匹配前一次条目一次以上(算上刚才所说的,再加上任意次重复);
?表示前一次的条目是可有可无的(刚才所说的,有还是没有都行)。
批注:它们必须接在某个东西之后。如:/fred\t*barney/能匹配fred和barney之间有任意多个制表符的串,也包括"fredbarney"(0次)
5、模式分组
圆括号(())的作用,模式/fred+/会匹配fredddddd这样的字符串,而模式/(fred)+/会匹配像fredfredfred这种字符。
()也使字符串重新引用成为可能。
$_="abba"; if(/(.)\1/){ #同'bb'相匹配,(.)\1表明需要匹配连续出现的两个同样的字符。 print "It matched same character next to itself!\n"}
例:/y(....) d\1/
批注:该模式匹配y后面的4个连续的非回车字符,并且用\1在d字符之后重复这4个字符。
例:/y(.)(.)\2\1/
批注:该模式同'yabba'匹配
如何区分哪个括号是第几组?只要数左括号(包括嵌套括号)的序号就可以了。
例:/y((.)(.)\3\2) d\1/
批注:匹配的是yabba dabba
$_="aa11bb"if(/(.)\111){ #想要匹配aa11,但是失败无法匹配,因为perl会去找第111次反向引用 print "It matched!\n";}
use 5.010; $_="aa11bb"if(/(.)\g{1}11){ #通过使用\g{1},就能排除前面模式中的二义性,注意用的是花括号 print "It matched!\n";}
use 5.010; $_="aa11bb"if(/(.)\g{-1}11){ #\g{-1}用的是相对路径,即相对于自己的位置,这样修改增加括号都不会影响 print "It matched!\n";}
6、择一匹配
例:/fred|barney|betty/
批注:匹配任何含有fred或barney或betty的字符串
例:/fred( |\t)+barney/
批注:匹配fred和barney之间空格、制表符或两者组合出现一次以上的字符串
例:/fred( +|\t+)+barney/
批注:中间的分隔符就一定全是空格符或制表符,即fred和barney之间的分隔符必须是一样的。
例:/fred (and|or) barney/
批注:可用来匹配任何含有fred and barney或fred or barney的字符串
7、字符集
指的是一串可能出现的字符集合,通过卸载方括号([])内来表示。它只匹配单个字符,但可以是字符集里列出的任何一个。
例:[abcwxyz]
批注:匹配这7个字符中的任何一个。可使用连字符-,即可等效写为[a-cw-z]
例:[a-zA-Z]
批注:匹配52个子母中的任何一个
例:[\000-\177]
批注:匹配任何7位的ASCII字符
开头加脱字符^表示这些字符除外:
例:[^def]
批注:匹配除这三个字符外的任何字符
例:[^n\-z]
批注:匹配n、连字符与z以外的任何字符。这里的连字符要加上反斜线,因为它在字符集里具有特殊意义。但在/HAL-[0-9]+/里的第一个连字符则不需要反斜线,因为字符集括号以外的连字符没有特殊意义
8、常用字符集的简写
任意数字的字符集[0-9]=\d。
单词字符,包含字母,数字和下划线[A-Za-z0-9_]=\w(Perl里的单词里面应该只含有字母、数字和下划线)。
\w并不会匹配一个单词,它只会匹配单词字符集里的一个字符。
例:/fred \w+ barney/
批注:匹配fred、一个空格、一个单词再接一个空格与barney
\s简写擅长处理空白 = [\f\t\n\r ],即换页、制表、换行、回车、空格。常用的做法是使用\s*来匹配任意数目的空白(也包括0个空白)或\s+,因为这些空白字符对肉眼来说都是一样的,所以我们可以用这个简写来统一处理它们。
非数字:[^\d]=\D
非词:[^\w]=\W
非空白字符:[^\s]=\S
/[\dA-Fa-f]+/可以用来匹配16进制数字。
[\d\D]表示任何数字和非数字,它会匹配任何字符(包括换行符)
[^\d\D]什么都不匹配