定界符、非定界符
m(fred)、m<fred>、m{fred}、m[fred]
用双斜线//可以省略m
可选修饰符
/i 匹配不区分大小写
/s 匹配任意字符,修补了点号.不能匹配换行符
/x 匹配空白,使得阅读更容易,但是里面的空白被忽略。
其中要表示真正的井号#时用 \#或 [#]
/barney.*fred are good friends/ six ------>组合修饰符
锚定
脱字符^锚定字符串的开头, 美元符号$锚定字符串的结尾。
example,/^\s*$/匹配空白行。
单词锚定
\b 单词边界锚定 /\bFred\b/匹配Fred。注:用\b匹配的单词边界是字符集,不算符号。
\B 非单词边界锚定,匹配所有\b不能匹配的位置。
绑定操作符
=~ 让右边的模式来匹配左边的字符串
模式串中的内插
正则表达式里可以进行双引号形式的内插。
#!/usr/bin/perl -w
my $what = "larry";
while (<>){
if (/^($what)/){ # 模式的锚位被定在字符的开头
print "We saw $what in begining of $_";
}
}
捕获变量
是把部分字符串暂时记下来,如果有一个以上的圆括号,就会有一次以上的捕获。每个被捕获的对象是原本的字符串,而不是模式。
my $dino="I fear that I'll be extinct after 1000 years.";
if ($dino =~ /(\d*) years/){
print "That said '$1' years.\n"; #$1是1000.
捕获变量通常可以存活到下次成功的模式匹配为止。
不捕获模式
在左括号后加 问号和冒号(?:),说明这里的一对括号是为了分组而存在。
if (m/(?:bronto)? saurus (steak|burger)/) {
print "Fred wants $1.\n";
}
命名捕捉
捕捉的结果进入一个 特殊的哈希%+,其中key就是捕捉时候使用的特殊标签,value是被捕获的串。
写法是 (?<LABLE>PATTERN),LABLE自行命名,第一个捕捉标签是 name1,第二个是 name2。使用捕获串时访问的位置变成了 $+{name1}和$+{name2}。
use 5.010;
my $name='Fred or Barney';
if($names=~m/(?<name1>\w+) (?:and|or) (?<name2>\w+)/){
say "I saw $+{name1} and $+{name2}";
}
另一种写法是 \g{lable}
use 5.010
my $names='Fred Flinstone and Wilma Flinstone';
if($names=~m/(?<last_name>\w+) and \w g\{last_name}/){
say "I saw $+{last_name}";
}
\k{lable}等同于 \g{lable}
自动匹配变量
字符串实际匹配的部分会被自动存进 $&,匹配位置之前的字符串存入 $`,匹配位置之后的存入 $'。
通用量词
/a{5,15}/匹配重复5到15次的字母a。
优先级
1.圆括号(分组或者捕获) (...),(?:...),(?<lable>...)
2.量词 a* a+ a? a{n,m}
3.锚位和序列 abc ^a a$
4.择一 a|b|c
5.元素 a [abc] \d \1
/(wilma|pebbles?)/匹配到wilma、pebbles以及pebble这三个字符串。
模式测试程序
#!/usr/bin/perl
while(<>){ #每次读一行输入
chomp;
if (/YOUR_PATTERN_GOES_HERE){
print "Matched:|$`<$&>$'|\n"; #特殊匹配变量
}else{
print "No match:|$_|\n";
}
}