您的位置:首页 > 其它

Learn Perl 七~九章 正则表达式 要点整理

2011-09-02 14:07 253 查看
Note: 这份整理不能用来直接学习,必须先读过原书。

/abba/ 匹配含有"abba"

. 匹配除了\n意外所有字符

a* 匹配任意数量的a(包括0个)

a+ 匹配至少一个的a

a? 匹配一个或0个a

a{5,15} 匹配[5, 15]个a (低于5个不能匹配,超过15个能匹配,但是匹配15个)

a{5,} 匹配[5, 无穷]个a

a{5} 严格限制5个a

/abc|def|ghi/ 匹配含有abc或者def或者ghi

/(a+b)*/ 将a+b视为一个整体

/[a-z]/ 字符类,匹配a~z任意一个字母

/[^def]/ 匹配def三个字符之外的任意单个字符

\d =[0-9]

\w =[A-Za-z0-9_]

\s 匹配空白字符(5种:格式符、tab、换行符、回车符、空格符)= [\f\t\n\r ] (注意最后有空格)

之前都将模式放在一对正斜线里(//),这实际上是m//的简写。

m(fred), m<fred>, m{fred}, m[fred], m,fred,, m!fred!, m^fred^等都可以

修饰符:

/yes/i 不区分大小写

/a.b/s 使.能匹配任意字符

/a b/x 忽略模式中的空白(5种,同上)

/yes . no/isx 可以结合使用

锚定:

默认情况下,如果模式在字符串开头没能匹配上,它会顺着字符串下去,直到匹配上为止。如果使用了锚定(anchors)则可以要求模式在特定的位置进行匹配。

/^abc/ 匹配开头

/abc$/ 匹配结尾(忽略换行符)

/^\s*$/ 匹配空行 ?????????????????????????????????????????

词锚定

/\bfred\b/ 全字匹配fred

绑定操作符

if (/abba/) {} 默认对$_进行匹配,可以用 =~ 对指定字符串进行匹配。

$str=~/abba/ 与$str匹配是否含有abba

模式内的内插

/$str/ 匹配含有$str

匹配变量

括号()会引起正则表达式分配新的内存块

if(/(\S+) (\S+), (\S+)/) {
print "words were $1 $2 $3";

}

$1 $2 $3的顺序按照括号顺序,外括号优先

自动匹配变量

$& 上次匹配结果

$` 匹配成功前找到的字符串

$' 还未匹配的剩余部分

优先级(四级):

第一级: 括号()

第二级: 数量词

第三级: 锚定与序列

第四级: 或|

----------------------------------------------------------

使用正则表达式改变字符串

s///默认一次替换

最后加g

s/str1/str2/ str1被替换为str2

同样s///可以s###,若使用配对的字符,则s{}{},甚至s{}[]

/i,/x和/s也通用,且可写成/gixs,顺序无关

也可用=~改变默认的$_

大小写转换:

\U 要求之后全大写

\L 要求之后全小写

\E 终结\U or \L的影响

\u \l 影响下一个字符

顺序无关

\u\L or \L\u 首字母大写,其他小写。

split操作:

@field=split/separtor/,$str;

join操作

$str = join separtor, @field

m// 可在代码上下文中使用

my($first, $second, $third) =/(\S+) (\S+), (\S+)/;

my @words = ($text =~ /([a-z]+)/ig);

非贪婪数量词:

* + ? {} 是贪婪数量词,会进行最大限度的匹配,而非匹配到就返回

对于 yuanyin and lee is a couple. 使用/yuan.+lee/进行匹配:
首先找yuan,找到了之后找.+,会最大限度匹配,一直匹配到了行末couple.
然后找lee,发现已经结束了,而回退一个字符.+仍然匹
4000
配,因此回退一个字符找lee。
如果回退一个字符.+成立则回退一个字符,直到匹配到lee,或者回退字符导致.+不成立。

在数量词后加?,则成为非贪婪数量词,进行最小限度的匹配。

匹配多行文本:

/m

使用^与$锚定

非捕捉()--(?:string):出现括号只计数,不开内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息