设为首页 加入收藏

TOP

Perl正则表达式超详细教程(一)
2018-10-10 04:10:29 】 浏览:364
Tags:Perl 正则 表达式 详细 教程

另外,本系列只介绍匹配操作,关于内容替换,因为和学习使用perl正则并无多大关系,所以替换相关的将在下一篇文章单独解释。


以下是perl正则的man文档:


新建一个文件作为perl脚本文件,在其首行写上#!/usr/bin/perl,它表示用perl作为本文件的解释器。写入一些perl程序后,再赋予执行权限就可以执行了,或者直接使用perl命令去调用这个脚本文件,前面的两个过程都可以省略,这和shell脚本的方式是完全一样的,无非是将bash替换为了perl,想必各位都理解。


1.print用来输出信息,相当于shell中的echo命令,但需要手动输入换行符"\n"进行换行。


例如:


保存后,执行它(假设脚本文件名为test.pl):


2.变量赋值


perl中的变量可以不用事先声明,可以直接赋值甚至直接引用。注意变量名前面总是需要加上$符号,无论是赋值的时候还是引用的时候,这和其它语言不太一样。


3.if语句用来判断,语法格式为:


例如:


4.默认参数变量


在perl中,对于需要参数的函数或表达式,但却没有给参数,这是将会使用perl的默认参数变量$_


例如,下面的print本来是需要参数的,但是因为没有给参数,print将输出默认的参数变量$_,也就是输出"abcde"。


perl中使用$_的地方非常多,后文还会出现,不过用到的时候我会解释。


5.读取标准输入


perl中使用一对尖括号格式的<STDIN>来读取来自非文件的标准输入,例如来自管道的数据,来自输入重定向的数据或者来自键盘的输入。需要注意的是,<STDIN>读取的输入会自带换行符,所以print输出的时候不要加上额外的换行符。


例如,在test.pl文件中写入如下内容:


然后用管道传递一行数据给perl程序:


只是需要注意,将<STDIN>赋值给变量时,将只能读取一行(遇到换行符就结束读取)。例如下面的perl将读取不了"hijklmn"。


如果想要读取多行标准输入,就不能将其赋值给变量,而是使用foreach来遍历各行(此处不介绍其它方式):


以上就是foreach的语法:


可以省略$line,这时就采用默认的参数变量$_,所以以下两个表达式是等价的:


6.读取文件中的数据


正则强大的用处就是处理文本数据,所以必须要说明perl如何读取文件数据来做正则匹配。


我们可以将文件作为perl命令行的参数,perl会使用<>去读取这些文件中的内容。


执行的时候,只要把文件作为perl命令或脚本文件的参数即可:


7.去掉行尾分隔符


由于<><STDIN>读取文件、读取标准输入的时候总是自带换行符,很多时候这个自带的换行符都会带来格式问题。所以,有必要在每次读取数据时将行尾的换行符去掉,使用chomp即可。


例如:


以下是执行结果:


如果上面的例子中不加上chomp,那么执行结果将像下面一样:


显然,输出格式和print语句中期待的输出格式不一样。


前面说过,可以省略$line,让其使用默认的参数变量$_,所以可以这样读取来自perl命令行参数文件的数据:


8.命令行的操作模式


其实就是一行式。perl命令行加上"-e"选项,就能在perl命令行中直接写perl表达式,例如:


因为perl最为人所知的就是它应用了各种符号的组合,让人看着怪异无比,而这些符号放在命令行中很可能会被shell先解析,所以强烈建议"-e"后表达式使用单引号包围,而不是双引号。


更建议,如果可以,不要使用perl命令行的方式,调试起来容易混乱。


使用=~符号表示要用右边的正则表达式对左边的数据进行匹配。正则表达式的书写方式为m//。关于m//,其中斜线可以替换为其它符号,规则如下:


所以要匹配内容,有以下两种方式:


perl中匹配操作返回的是匹配成功与否,成功则返回真,匹配不成功则返回假。当然,perl提供了特殊变量允许访问匹配到的内容,甚至匹配内容之前的数据、匹配内容之后的数据都提供了相关变量以便访问。见下面的示例。


例如:


1.匹配给定字符串内容


或者,直接将字符串拿来匹配:


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


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


以下是执行结果:


3.匹配文件中每行数据


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


例如:


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


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


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


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


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


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


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


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


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


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


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



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


例如,字符串"abcabc",正则表达式"ab",在默认情况下(不是全局匹配)该正则在匹配到第一个ab后就结束了,如果使用了g修饰符,匹配完第一个ab,还会继续向后匹配,而且正好还能匹配到第二个ab,所以最终有两个ab被匹配成功。


要验证多次匹配,需要使用循环遍历的方式,而不能用if语句:


执行它,将输出如下内容:


以下内容,如果仅仅只是为了学perl正则,那么可以跳过,因为很难,如果是学perl语言,那么可以继续看下去。


实际上,在开启了g全局匹配后,perl每次在成功匹配的时候都会记下匹配的字符位移,以便在下次匹配该内容时候,可以从指定位移处继续向后匹配。每次匹配成功后的位移值(pos的位移从0开始算,0位移代表的是第一个字符左边的位置),都可以通过pos()函数获取。如果本次匹配导致位移指针重置,pos将返回undef。


执行它,将输出如下内容:


由于匹配失败的时候,正则匹配操作会返回假,所

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇排序变换思路:施瓦茨变换 下一篇Perl正则表达式引用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目