2007-01-29记录
正则表达式
在Perl中通常成为模式,某个模板是否匹配某个字符串
模式匹配//通常返回true或false,经常用在if和while条件表达式部分
元字符
点(.)是通配符,可以匹配任何单个字符,但不包括换行符\n,
反斜线\是第二个元字符
量词
星号(*)表示匹配前一项0次或多次
.*表示匹配任意字符任意次
加号(+)表示匹配前一项的1次或多次
问号(?)表示匹配前一项的1次或0次
这三个数量词必须跟在某些项的后面,因为它们是前面项的重复次数
模式中的分组
/(abc)+/表示1次多次出现abc
选择符|,表示匹配左边的或者右边的
单词and和or在正则表达式中不是操作符
任意单个字符[]
[abc],[a-zA-Z],[0-9]
取反
[^abc]
字符类的简写
\d [0-9]
\w [a-zA-Z0-9_]
\w+ 可匹配单词
\s [\f\t\n\r]
这些可以和*,+组合起来用
简写的补集
[^\d] \D
[^\w] \W
[^\s] \S
模式匹配
m//,简写成//
标记,后缀在正则表达式后面来改变其默认行为
不区分大小写/i
匹配任何字符,包括换行符/s
在模式中加入任何数量的空格,但会忽略空格/x
匹配#号,可使用\#或[#]
锚定
/^boy/只匹配以boy开头的字符串
/boy$/只匹配以boy结尾的字符串
匹配一个空行/^\s*$/
词锚定\b
/\bhello\b/只匹配hello,不匹配helloword
非词界锚定\B
绑定操作符=~
my $what=shift @ARGV
#将输入命令的第一个参数赋值给$what
while(<>){
if (^$what)
{
print "we saw $what in the beginning of $_\n";}}
匹配变量
将模式中的一部分用()括起来,$1表示第一对括号匹配的字符串,$2表示第二对()匹配的字符串
$_="hello,erery one";
if(/(\S+),(\S+) (\S+)/){
print "words are $1 $2 $3\n";}
这样可以提取出我们想要的字符串
匹配上的变量值不会变,直到模式成功匹配到下一个为止
由于内存中的值不会一直保留,模式匹配后尽快使用$1这样的变量
if($what =~ /(\w+)/){
$value = $1;
}
$&整个匹配的部分
if ("hello there,neighbour"=~/\s(\w+),/){
print "these matche are '$&'.\n";
}
匹配部分是" there,",$1的值为there,$&的值为 there,
匹配部分的前一部分放在$`,后一部分放在$'
/a{2,6}/匹配2个到6个a
/a{2,}/2个a以上,没有上限
/a{2}/2个a
优先级
最优先()
第二级是数量词*,+,?,{}
第三级是锚定和序列
第四级是竖线|,表示或