Perl正则表达式超详细教程(3)

2.匹配来自管道的每一行内容,匹配成功的行则输出

foreach (<STDIN>){ chomp; if (/gao/){ print "$_ was matched 'gao'\n"; } }

上面使用了默认的参数变量$_,它表示foreach迭代的每一行数据;上面还简写的正则匹配方式/gao/,它等价于$_ =~ m/gao/。

以下是执行结果:

[root@xuexi perlapp]# echo -e "malongshuai gaoxiaofang" | perl 26.plx malongshuai gaoxiaofang was matched 'gao'

3.匹配文件中每行数据

foreach (<>){ chomp; if(/gao/){ print "$_ was matched 'gao'\n"; } }

4.如果想要输出匹配到的内容,可以使用特殊变量$&来引用匹配到的内容,还可以使用$`引用匹配前面部分的内容,$'引用匹配后面部分的内容

例如:

aAbBcC =~ /bB/

由于匹配的内容是bB,匹配内容之前的部分是aA,匹配之后的部分是cC,于是可以看作下面对应关系:

(aA)(bB)(cC) | | | $` $& $'

以下是使用这三个特殊变量的示例:

$name="aAbBcC"; if(/bB/){ print "pre match: $` \n"; print "match: $& \n"; print "post match: $' \n"; }

需要注意的是,正则中一般都提供全局匹配的功能,perl中使用修饰符/g开启。当开启了全局匹配功能,这3个变量保存的值需要使用循环语句去遍历,否则将只保存第一次匹配的内容。例如:

$name="aAbBcCbB"; if(/bB/g){ # 匹配完第一个bB就结束 print "pre match: $` \n"; print "match: $& \n"; print "post match: $' \n"; } while(/bB/g){ # 将迭代两次 print "pre match: $` \n"; print "match: $& \n"; print "post match: $' \n"; } perl支持的正则

从这里开始,正式介绍perl支持的正则。

出于方便,我全部都直接在perl程序内部定义待匹配的内容,如果想要匹配管道传递的输入,或者匹配文件数据,请看上文获取操作方法。

为了完整性,每一节中我都是先把一大堆的内容列出来做个简单介绍,然后再用示例解释每个(或某几个)。但perl正则的内容太多,而且很多功能前后关联,所以如果列出来的内容没有在同一小节内介绍,那么就是在后面需要的地方介绍。当然,也有些没什么用或者用的很少的功能(比如unicode相关的),通篇都不会介绍。

模式匹配修饰符

指定模式匹配的修饰符,可以改变正则表达式的匹配行为。例如,下面的i就是一种修饰符,它让前面的正则REG匹配时忽略大小写。

m/REG/i

perl总共支持以下几种修饰符:msixpodualngc

i:匹配时忽略大小写

g:全局匹配,默认情况下,正则表达式"abc"匹配"abcdabc"字符串的时候,将之匹配左边的abc,使用g将匹配两个"abc"

c:在开启g的情况下,如果匹配失败,将不重置搜索位置

m:多行匹配模式

s:让.可以匹配换行符"\n",也就是说该修饰符让.真的可以匹配任意字符

x:允许正则表达式使用空白符号,免得让整个表达式难读难懂,但这样会让原本的空白符号失去意义,这是可以使用\s来表示空白

o:只编译一次正则表达式

n:非捕获模式

p:保存匹配的字符串到${^PREMATCH}、${^MATCH}、${^POSTMATCH}中,它们在结果上对应$`、$&和$',但性能上要更好

a和u和l:分别表示用ASCII、Unicode和Locale的方式来解释正则表达式,一般不用考虑这几个修饰符

d:使用unicode或原生字符集,就像5.12和之前那样,也不用考虑这个修饰符

这些修饰符可以连用,连用时顺序可随意。例如下面两行是等价的行为:全局忽略大小写的匹配行为。

m/REG/ig m/REG/gi

上面的修饰符,本节介绍igcmsxpo这几个修饰符,n修饰符在后面分组捕获的地方解释,auld修饰符和字符集相关,不打算解释。

i修饰符:忽略大小写

该修饰符使得正则匹配的时候,忽略大小写。

$name="aAbBcC"; if($name =~ m/ab/i){ print "pre match: $` \n"; # 输出a print "match: $& \n"; # 输出Ab print "post match: $' \n"; # 输出BcC } g和c修饰符以及\G

g修饰符(global)使得正则匹配的时候,对字符串做全局匹配,也就是说,即使前面匹配成功了,还会继续向后匹配,看是否还能匹配成功。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e1a716f6fc1f35a6ad219d4af05ea1f5.html