Perl语言之所以是一种非常擅长文本处理的语言,我想很多都是由于正则表达式的缘故。Perl语言中的正则表达式功能基本是所有常用语言中最强大的,以至于很多语言设计正则表达式支持的时候都参考Perl语言的正则表达式。正则表达式描述的是一种匹配模式,换言之就是可以快速判断目标字符串是否与我们提供的模板匹配,或者快速判断目标字符串中是否含有与我们的模板匹配的部分。除了检查是否匹配之外,正则表达式还支持替换、转化等操作。概括而言,Perl的正则表达式有三种形式:
- 匹配:m//(还可以缩写为//)
- 替换:s///
- 转化:tr///
这三种形式一般都和=~(表示匹配)或者!~(表示不匹配)搭配使用。它们不仅在语法上更为简洁,还可以像双引号字符串一样解析,而不是作为普通的操作符。
匹配操作符
匹配操作符顾名思义就是用于匹配一个字符串语句的表达式,即m//,也可以直接缩写成//。需要进行匹配的字符串模板写在两个斜线中间。例如:
#!/usr/bin/perl
$text = "beforematchafter";#目标字符串
if ($text =~ /match/)#检查目标字符串中是否有match这个字符串
print "Matched";
else
print "No match";
实际上,这对斜线就是一组定界符。言外之意,我们可以用任意别的定界符替换双斜线,例如m(match)、m{match}等等都是可以的。当然,选择模式中不会出现的字符作为定界符才是明智的选择。我们可以默认用斜线作为定界符,当模式中存在斜线的时候,比如说去匹配网址的时候,我们再临时使用一下别的定界符,这样可以有效避免代码出错。
Perl语言中存在好几个模式匹配修饰符,也成为标志。它们是追加在模式表达式的定界符后面的字符,用来改变默认的匹配行为。
用/i进行大小写无关的匹配
如果模式表达式后面加上小写字母i,则匹配过程中程序会完全无视大小写之间的区别。举例而言,YES、yes、Yes等等在这里是完全等价的。
用/s匹配任意字符
默认的情况下,点号“.”无法匹配换行符,这在绝大多数情况下都是很合理的。但是个别时候,如果我们希望点号可以匹配换行符,那么我们可以在模式表达式后面加上s。它会将模式中的每个点号转换成按字符集[\d\D]进行处理。
用/x加入空白符
有时候我们的模式表达式写出来会显得很凌乱,如果我们可以在其中加入空格进行分割、对齐的话可以使得代码更为易读。但是随意的添加空格又会导致匹配失败。在模式表达式的后面加上x就可以解决这个问题。它会使程序在匹配的过程中忽略模式表达式中的空格。
组合选项修饰符
当一次匹配需要用到上述的多个特性的时候,我们可以将对应的标志全部加到模式表达式的后面,而不用在乎它的顺序。
锚位
默认的情况下,给定的模式如果不匹配字符串的开头,就会从下一个字符继续尝试,通过给定锚位,我们能够让模式仅仅在字符串的指定位置匹配。
\A锚位匹配字符串的绝对开头。例如我们想检查某个网址是不是https开头的就可以使用这个锚位;\z匹配字符串的绝对末尾,例如我们想检查文件名的后缀是不是.jpeg,就可以使用这个锚位。\b是单词边界锚位,它匹配任何单词的首尾。不过,这里的单词不是指一般的英文单词,而是一组\w字符构成的字符集,即可以是英文字母,也可以是数字和下划线。
替换操作符
替换操作符是匹配操作符的一个扩展,其作用是,如果成功匹配,就将匹配的部分替换为另一个字符串。基本格式如下:
s/PATTERN/REPLACEMENT/;
PATTERN为匹配模式,REPLACEMENT为替换的字符串。
和匹配操作符相同,替换操作符也有一些可以使用的标志:
修饰符 | 描述 |
i | 如果在修饰符中加上“i”,则正则表达式会取消大小写敏感性。 |
m | 默认的正则开始“^”和结束“$”只是对于正则字符串。如果在修饰符中加上“m”,那么开始和结束将会指字符串的每一行。 |
o | 表达式只执行一次。 |
s | “.”将会代表任意字符。 |
x | 表达式中的空白字符将会被忽略,除非它已经被转义。 |
g | 替换所有匹配的字符串。 |
e | 替换字符串作为表达式。 |
转化操作符
以下是转化操作符相关的修饰符
修饰符 | 描述 |
c | 转化所有未指定字符 |
d | 删除所有指定字符 |
s | 把多个相同的输出字符缩成一个 |
举例而言,我们打算将一个变量中所有的小写字母都变成大写字母:
#! /usr/bin/perl
$string = 'We want to change this sentence.';
$string =~ tr/a-z/A-Z/;
print "$string\n";
执行以上程序的输出结果为:WE WANT TO CHANGE THIS SENTENCE.