使用简单的模式:
要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,所有在双引号中的转义字符在模式中均有效,因此你可以使用/coke\tsprite/来匹配 11 个字符的字符串 coke, tab(制表符),sprite
元字符:
点(.)是通配符,它可以匹配任何单个的字符,但不包括换行符
星号(*)表示匹配前一项0次或者多次,因此.*将匹配任意字符任意多数
加号(+)的意思是可以匹配前面一项的一个或多个.
问号(?),其含义是前面一个项出现一次,
括号(())用来表示分组
竖线(|),在这种用法中通常被读作“ 或(or)” ,意思是匹配左边的或者右边的。如果竖线左边没有匹配上,则匹配右边
字符类,是方括号[]中的一列字符,可以匹配上括号内出现的任意单个字符。它匹配一个字符,但这个字符可以是列中的任意一个,为了方便,我们可以使用连字号(-)来表示某个范围的字母
字符类前使用符号^将取此字符类的补集。也就是说,[^def]]将匹配上这三个字符中之外的任意单个字符。[^n\-z]将匹配上 n, -, z之外的任何字符。
字符类的简写:
任何数字的类,[0-9],可以被简写为:\d
\w 被称作 “ word’ 字符:[A-Za-z0-9_]
格式符(form-feed);制表符(tab),换行符,回车,以及空格符。同其它简写符号一样,\s 匹配此类中的单个字符,如果使用\s*将匹配任何个数的空白(包括没有),或者\s+匹配一个以上的空白
使用[^\d], [^\w], 和[^\s],其含义分别是,非数字的字符,非word(记住我们对word 的定义)的字符,和非空白的字符
也可以使用它们对应的大写形式:\D, \W, \S来完成。它们将匹配它们对应的小写形式不能匹配上的字符。
另一个类字符[\d\D],它的意思是任何数字,和任何非数字,则意指任何字符。这是匹配所有字符的一种通用方法,甚至包括换行符,而点(.)匹配除换行符以外的任何字符.
正则表达式的应用
使用 m//匹配:
我们曾经将模式放在一对正斜线(//)里面,如/fred/。这是m//(模式匹配)的一种简写。同qw//操作一样,可以使用任何成对的分隔符,如果使用正斜线(/)作为分隔符,则可以省略掉前面的m
可选的修饰符:
不区分大小写:/i
匹配任何字符:/s:默认情况下,点(.)不匹配换行符,这对于“ 单行中查找” 的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹配它们,那可以使用/s这个修饰符,如if(/Barney.*Fred/s)
/x修饰符,允许你在模式中加入任何数量的空白
符号^表示在字符串的开头进行匹配,而符号$则表示在结尾,模式/^fred/只匹配字符串的开头部分;它不会匹配上manfred man。而/rock$/只在结尾处匹配
词界锚定,\b,是针对单词使用的。如/\bfred\b/可以匹配上单词fred,但不能匹配frederick,
绑定操作符,=~:,使用绑定操作符(=~)将告诉 Perl将右边的模式在左边的字符串上进行匹配,如:if($some_other =~ /\brub/)
模式中的数量词表示前面项重复的次数。你已经见过三个数量词:*, +, ?。如果这三个数量词仍不能满足你的要求,那可以使用花括号({}),花括号中有2 个数字,由逗号隔开,表示前面一项允许重复的次数,模式/a{5,15}/将匹配5 个到15个a 中的任意一个,如果省略掉第二个数字(逗号留下),现在没有上限了
使用正则表达式处理文件:
1、使用s///进行替换:如果将 m// 这个模式匹配看作同文字处理器的 “ 查询(search)” 类似的功能,那 Perl 中 s ///操作的则类似于“ 查询并替换(search and replace)”,如:s/Barney/Fred/;
2、使用/g进行全局替换:修饰符/g 要求 s///将不相重叠的所有匹配上的部分都进行替换,s/home/cave/g;
s/^\s+//; #将开头的空白去掉
s/\s+$//; #将结尾的空白去掉
3、大小写转换:\U 要求紧接着的均是大写,也可以要求后面的均为小写:\L:
$_ =“ I saw Barney with Fred.” ;
s/(fred|barney)/\U$1/gi; #$_现在是 “ I saw BARNEY with FRED.”
4、split操作:另一个使用正则表达式的操作是 split,它根据某个模式将字符串分割开,下面是一个典型的split 操作,由冒号分开:
@fields = split /:/, “ abc:def:g:h” ; #返回(“ abc” , “ def” , “ g” , “ h” )
使用空白/\s+/这个模式进行分割是非常常见的。在这个模式下,所有的空白等价于单个空格:
my $some_input = “ This is a \t test.\n” ;
= split /\s+/, $some_input; #(“ This” , “ is” , “ a” , “ test.” )
5、join函数:join 函数不使用模式,但它完成同split 相反的操作:split 将一个字符串分割开,而join 函数将这些分割的部分组合成一个
整体。join 函数类似于:
my $result = join $glue, @pieces;
join 函数的第一个参数是粘合元素(glue),它可以是任意字符串。剩下的参数是要被粘合的部分。join 将粘合元素添加在这些部分之间,并返回其结果:
my $x = join“ :” , 4, 6, 8, 10, 12; #$x 为 “ 4:6:8:10:12”
更多更详细内容,请参考《Mastering Regular Expressions》3rd Edition,
阅读(736) | 评论(0) | 转发(0) |