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

来源:互联网 发布:中文版音乐制作软件 编辑:程序博客网 时间:2024/05/21 17:02

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,发现已经结束了,而回退一个字符.+仍然匹配,因此回退一个字符找lee。
如果回退一个字符.+成立则回退一个字符,直到匹配到lee,或者回退字符导致.+不成立。


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


匹配多行文本:
/m
使用^与$锚定


非捕捉()--(?:string):出现括号只计数,不开内存。