第五章 模式匹配
匹配一个字符边界
匹配一个普通水平制表字符
/bar{3}/ 匹配的是barrr
5.2 模式匹配操作符:
m// 用于匹配一个模式,s///用于将某个符合模式的子字符窜代换为某个子串
每次成功匹配了一个模式(包括替换中的模式),操作符都会把变量$`,$&,$' 分别设置为
匹配内容左边内容,匹配的内容和匹配内容右边的文本。
[oracle@june2 perl]$ cat 1.pl
"hot cross buns" =~ /cross/;
print "Left <$`>
";
print "Match <$&>
";
print "Right <$'>
";
[oracle@june2 perl]$ perl 1.pl
Left <hot >
Match <cross>
Right < buns>
为了有更好的颗粒度和提高效率,你可以用圆括弧捕捉你特别想分离出来的部分。
每对圆括弧捕捉与圆括弧内的模式相匹配的子模式。圆括弧由左圆括弧的位置
从左到右依次排序,对应那些子模式的子字符串在匹配之后可以通过顺序的变量$1,$2,$3
等等获得:
[oracle@june2 perl]$ cat 2.pl
$_ = "Bilbo Baggins's birthday is September 22";
/(.*)'s birthday is (.*)/;
print "Person: $1
";
print "Date: $2
";
[oracle@june2 perl]$ perl 2.pl
Person: Bilbo Baggins
Date: September 22
5.2.1 模式修饰词:
/i 忽略大小写
[oracle@june2 perl]$ cat 3.pl
$_='Abc';
if ($_ =~/abc/i){print "1---ok
"};
$_='Abc';
if ($_ =~/abc/){print "2---ok
"};
[oracle@june2 perl]$ perl 3.pl
1---ok
/s 让.匹配换行符并且忽略不建议使用的$*变量
[oracle@june2 perl]$ cat 3.pl
$_="Abc
aaaaaaaa";
if ($_ =~ /abc.a/is){print "1------ok
"};
$_="Abc
aaaaaaaa";
if ($_ =~ /abc.a/i){print "2------ok
"};
[oracle@june2 perl]$ perl 3.pl
1------ok
/x添加空格
m/w+:(s+w+)s*d+/; # 一个词,冒号,空白,词,空白,数字。
m/w+: (s+ w+) s* d+/x; # 一个词,冒号,空白,词,空白,数字。
m{
w+: # 匹配一个词和一个冒号。
( # 分组开始。
s+ # 匹配一个或多个空白。
w+ # 匹配另外一个词。
) # 分组结束。
s* # 匹配零或更多空白。
d+ # 匹配一些数字
}x;
[oracle@june2 perl]$ cat 4.pl
$_="a: b 3";
if ($_ =~ m/w+:(s+w+)s*d+/){ print "1---------ok
"};
$_="a: b a3";
if ($_ =~ m/w+:(s+w+)s*d+/){ print "2---------ok
"};
$_="a: b 3";
if ($_ =~ m{
w+: # 匹配一个词和一个冒号。
( # 分组开始。
s+ # 匹配一个或多个空白。
w+ # 匹配另外一个词。
) # 分组结束。
s* # 匹配零或更多空白。
d+ # 匹配一些数字
}x){print "3---------ok
"};
/g 全局匹配:
[oracle@june2 perl]$ cat 5.pl
$_ ="abcabc";
if ($_ =~ s/a/xx/){print "$_ is 1---$_
"};
$_ ="abcabc";
if ($_ =~ s/a/xx/g){print "$_ is 2---$_
"};
[oracle@june2 perl]$ perl 5.pl
$_ is 1---xxbcabc
$_ is 2---xxbcxxbc
[oracle@june2 perl]$ perl 4.pl
1---------ok
3---------ok
5.2.2 m// 操作符(匹配)
5.3 元字符和元符号
<pre name="code" class="sql">+ 是一个特殊字符,表示匹配"+前边内容一次或多次。
s 空白
f
w [a-zA-Z_0-9] 匹配任何单个字符
d 数字
. 点号 匹配所有的字符,除换行符外
d{7,11} 将匹配最少7位数字,但不会多于11位数字。
+ 代表最少一次
* 表示0次或多次
量词原子性含义
* 否匹配 0 或者更多次数(最大)。
+ 否匹配 或者更多次数(最大)。
? 否匹配 1 或者0次(最大)。
{COUNT} 否匹配COUNT 次
{MIN,} 否匹配至少MIN次(最大)
。
{MIN,MAX} 否匹配至少MIN次但不超过MAX次(最大)
*? 否匹配0或者更多次(最小)
+? 否匹配1或者更多次(最小)
?? 否匹配0或者1次(最小)
{MIN,}? 否匹配最多MIN次(最小)
{MIN,MAX}? 否匹配至少MIN次但不超过MAX次(最小)
? 表示零或一次
在perl里你可以强制进行非贪婪匹配,在量词后面加上一个问号来表示最小匹配。
我们同样的用户名匹配就可以写成/.*?:/。 这里.*? 现在尽可能少地匹配字符,而不是尽可能多的匹配字符。
.+ 保证至少匹配字串的一个字符