第五章 模式匹配

第五章   模式匹配
 匹配一个字符边界

	 匹配一个普通水平制表字符

/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里你可以强制进行非贪婪匹配,在量词后面加上一个问号来表示最小匹配。


我们同样的用户名匹配就可以写成/.*?:/。 这里.*? 现在尽可能少地匹配字符,而不是尽可能多的匹配字符。

.+ 保证至少匹配字串的一个字符

原文地址:https://www.cnblogs.com/hzcya1995/p/13351817.html