4.1 perl--漫游正则表达式
正则表达式(regular expression)是perl内嵌,自成一体的微型编程语言。出现在很多语言中,以及在大多数的程序员文本编辑器中(比如vi和emacs).在perl里通常叫做模式(pattern),用来表示匹配或不匹配某个字符段的特征模板。只要用一个模式就可以将它们干净利落地分成两组:匹配或者不匹配。
在Unix的grep命令中,它会检查哪几行文本匹配到指定的模式,然后输出那几行。例如:
$grep 'flint.*stone' chapter*.txt
如果模式匹配的对象是$_的内容,只要模式写在一对斜线(/)中就可以了,自动去寻找
例如:
$_="yabba dabba doo"'
if (/abba/){
print;
}
Unicode属性
他们不只是简单的字节序列。每个字ifu出来字节组合之外,还有属性信息。若要匹配某项属性,只需要把属性名放入\p{PROPERTY}\里面。比如许多字符属于空白符,相应的属性名为space,所以要匹配带有这类属性的字符,可以用\p{Space}.将小写的p改为大写的P,就表示否定的意义,匹配指定属性之外的字符。
. 能匹配任意一个字符的通配符(不能匹配换行符\n),如果要表示点号本身的话,就需要在前面加上反斜线转 义。同时,如要匹配真正的\,也需要在前面加上\。
* 用来匹配前面的条目零次或多次的。
+ 匹配前一个条目一次以上。
? 表示前一个条目是可有可无的
() 对字符串来分组
我们可以用反向引用来引用圆括号中的模式所匹配的文字,这个行为我们成为捕获组。
(.)\1 表示匹配连续出现的两个同样的字符。\后面的数字是编号,只要一次点算左括号的序号就可以了/
$_="yabba dabba doo";
if (/y((.)(.)\3\2)d\1/){
print;
}
有的时候为了消除反向引用模式的直接量部分的二义性
use 5.010; #这个版本开始才有这个功能
$_="aa11bb";
if (/(.)\g{1}11/){
print;
}
这里面的g{1}就相当于\1,主要是为了避免歧义嘛,同时,也可以用负数,相反的意思。
| 通常读成“或”,要么匹配左边的内容,要么匹配右边的内容。
[] 表示里面的字符集中任何一个,比如[a-z],其中-是连字符,表示从a到z
^ 表示除什么之外,[^a-z]除a到z之外的任意的字符都能匹配
字符的简写
- 表示任意一个数字的字符集的简写是\d
- \s 匹配任意空白符
- \w现在被扩展了,表示单词嘛
[\d\D] 表示任何数字或非数字,就是说能匹配到任意的字符。它跟.相比的话,这个同时还包括换行符。
例1:检验已知文件中是否含有fred或者Fred字符,有的话就把这一行打印出来。
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if(/(f|F)red/){
print ;
}
}
例2:找包含.的字符串,打印出来那一行。这里面相当用了一个转义符
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if(/\./){
print ;
}
}
例3:打印那些有两个相连且相同的非空字符的行。
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if(/(\S)\1/){
print ;
}
}
例4:打印出同时出现wilma以及fred的行(注意先后之别)
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if (/wilma.*fred|fred.*wilma/){
print;
}
}
ps:
- 上面的方法尽管参考,方法肯定不止一个
- 如果跟我一样是菜鸟,请结合我的第之前的博客看如何运行这样的脚本。
- 博文内容为整理的《Perl语言入门》这本书,感谢这个书的作者Randal L等人的付出
这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn