精通正则表达式二:Perl中正则表达式的基本应用

时间:2022-12-03 18:25:07

本书的第二章主要讲的是在Perl语言中运用正则表达式,虽然以前没有接触过Perl语言,但作者的前提就是假设读者不会Perl语言,所以对于有一定编程基础的人来说读起来没有太大困难,关于Perl语言的简单入门,除了书上讲的,可以参考这篇:http://blog.csdn.net/zhangjikuan/article/details/52199059,本篇文章主要写一些与正则表达式有关的部分。

1.匹配

my $reply = "2412341dfas"; // 定义一个字符串
if($reply =~ m/^[0-9]+$/){ // 判断是否匹配
print "only digits\n";
} else {
print "not only digits\n";
}

可见,‘=~’ 用来连接欲搜索的字符串和‘m/…/’,‘m’是匹配的意思,斜杠中间则写正则表达式

2.替换

替换的话可以直接在终端运行,很方便

perl -p -i -e 's/abc/Ira/g' word.txt

参数解释

-p 对目标文件的每一行进行查找
-i 将替换的结果写回文件
-e 整个程序接在命令后面

单引号中的部分就是一个perl程序,‘s’与前面的‘m’想类似,代表替换,‘abc’代表匹配的内容,‘Ira’代表将匹配的内容替换为‘Ira’,‘/g’是一个参数,代表全局替换,不加的话只会匹配一行中第一个,如果这一行中后续还有的话不会替换掉。

末尾的参数

如前面的‘/g’一样,Perl中还提供了其他的一些参数:

g    全局替换
i 忽略大小写
e 将计算后的结果替代匹配的字符串
m 增强的行锚点
x 宽松排列,并允许出现以#开头标记的注释

前面两个好理解,对于参数‘e’,看下面这个例子:

my $x = "比例为24%";
$x =~ s!(\d+)%!$1/100!e; #先将第一组的内容除以100再替换

最后的结果是‘比例为0.24’,其中‘!’和前面‘/’的作用是一样的,其分隔符的作用,这样就可以避免转义除号。

对于第四个增强的行锚点,因为‘^’和‘$’通常匹配的不是逻辑行的开头和结尾,而是整个字符串的开头和结尾,什么意思呢?,比如我们将下面一段文本读入一个字符串中:

单引号中的部分就是一个perl程序,‘s’与前面的‘m’想类似,代表替换

‘abc’代表匹配的内容,‘Ira’代表将匹配的内容替换为‘Ira’,‘/g’是一个参数,代表全局替换

本来是有三行,但将它读取到字符串中后,‘^’和‘$’将只能匹配整个字符串的开头和结尾,即成了一行。更简单点说,就是在RegExr上,字符串是没有勾选multiline的情况,加上‘m’后,就成了勾选了multiline的情况。

对于参数‘x’,这这只是正则表达式的排版上的问题,正常来说正则表达式是紧密排列的,加上参数‘x’后,就可以像写代码一样写正则表达式了:

$text =~ s{
\b
#可以写注释,可以将正则表达式写在多行
(
regex1
(
regex2
)
)
\b
}{replacement}

这样增强了它的可读性,这里面的‘{’和‘}’与前面的‘/’的作用是一样的,都是其分隔的作用,这样做的好处是可以当正则表达式中需要用到‘/’的时候不用进行转义。