简介
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。
Perl的正则表达式的三种形式,分别是匹配,替换和转化:
匹配:m//(还可以简写为//,略去m)
替换:s///
转化:tr///
这三种形式一般都和 =~ 或 !~ 搭配使用, =~ 表示相匹配,!~ 表示不匹配。
匹配操作符
匹配操作符 m// 用于匹配一个字符串语句或者一个正则表达式,例如,要匹配 标量 $bar 中的 "run",代码如下所示:
实例
#!/usr/bin/perl $bar = "I am runoob site. welcome to runoob site."; if ($bar =~ /run/){ print "第一次匹配\n"; }else{ print "第一次不匹配\n"; } $bar = "run"; if ($bar =~ /run/){ print "第二次匹配\n"; }else{ print "第二次不匹配\n"; }
执行以上程序,输出结果为:
第一次匹配
第二次匹配
模式匹配修饰符
模式匹配有一些常用的修饰符,如下表所示:
修饰符 | 含义 |
/i | 匹配时忽略大小写 |
/g | 全局匹配,默认情况下,正则表达式"abc"匹配"abcdabc"字符串的时候,将之匹配左边的abc,使用g将匹配两个"abc" |
/c | 在开启g的情况下,如果匹配失败,将不重置搜索位置 |
/m | 多行匹配模式。默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。 |
/s | 让.可以匹配换行符"\n",也就是说该修饰符让.真的可以匹配任意字符 |
/x | 允许正则表达式使用空白符号,免得让整个表达式难读难懂,但这样会让原本的空白符号失去意义,这是可以使用\s来表示空白 |
/o | 只编译一次正则表达式 |
/n | 非捕获模式 |
/p | 保存匹配的字符串到${PREMATCH}、${^MATCH}、${POSTMATCH}中,它们在结果上对应$`、$&和$’,但性能上要更好 |
/a和/u和/l | 分别表示用ASCII、Unicode和Locale的方式来解释正则表达式,一般不用考虑这几个修饰符 |
/d | 使用unicode或原生字符集,就像5.12和之前那样,也不用考虑这个修饰符 |
/g | 全局查找所有匹配 |
/cg | 允许在失败的匹配后继续保留上一次匹配的位置,不会重置指针位置 |
正则表达式变量
perl处理完后会给匹配到的值存在三个特殊变量名:
- $`: 匹配部分的前一部分字符串
- $&: 匹配的字符串
- $': 还没有匹配的剩余字符串
如果将这三个变量放在一起,你将得到原始字符串。
实例如下:
#!/usr/bin/perl
$string = "welcome to runoob site.";
$string =~ m/run/;
print "匹配前的字符串: $`\n";
print "匹配的字符串: $&\n";
print "匹配后的字符串: $'\n";
执行以上程序输出结果为:
匹配前的字符串: welcome to
匹配的字符串: run
匹配后的字符串: oob site.
替换操作符
替换操作符 s/// 是匹配操作符的扩展,使用新的字符串替换指定的字符串。基本格式如下:
s/PATTERN/REPLACEMENT/;
PATTERN 为匹配模式,REPLACEMENT 为替换的字符串。
例如我们将以下字符串的 "google" 替换为 "runoob":
#!/usr/bin/perl
$string = "welcome to google site.";
$string =~ s/google/runoob/;
print "$string\n";
执行以上程序输出结果为:
welcome to runoob site.
替换操作修饰符
替换操作修饰符如下表所示:
修饰符 | 含义 |
/i | 匹配时忽略大小写 |
/g | 全局匹配,默认情况下,正则表达式"abc"匹配"abcdabc"字符串的时候,将之匹配左边的abc,使用g将匹配两个"abc" |
/c | 在开启g的情况下,如果匹配失败,将不重置搜索位置 |
/m | 多行匹配模式。 默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。 |
/s | 默认的"."代表除了换行符以外的任何字符。加了/s则包括换行符 |
/x | 允许正则表达式使用空白符号,免得让整个表达式难读难懂。但这样会让原本的空白符号失去意义,这时可以使用\s来表示空白 |
/o | 只编译一次正则表达式 |
/n | 非捕获模式 |
p | 保存匹配的字符串到${^PREMATCH}、${^MATCH}、${^POSTMATCH}中,它们在结果上对应$`、$&和$’,但性能上要更好 |
/a和/u和/l | 分别表示用ASCII、Unicode和Locale的方式来解释正则表达式,一般不用考虑这几个修饰符 |
/d | 使用unicode或原生字符集,就像5.12和之前那样,也不用考虑这个修饰符 |
/r | 返回替换,原字符串保持不变 |
/e | 将右边作为一个表达式来计算 |
转化操作符
以下是转化操作符相关的修饰符:
修饰符 | 含义 |
/c | 转化所有未指定字符。 |
/d | 删除找到但是未替换的字符串 |
/s | 把多个相同的输出字符缩成一个 |
/r | 返回转换字符串,原字符串保持不变 |
以下实例将变量 $string 中的所有小写字母转化为大写字母:
#!/usr/bin/perl
$string = 'welcome to runoob site.';
$string =~ tr/a-z/A-z/;
print "$string\n";
执行以上程序输出结果为:
WELCOME TO RUNOOB SITE.
以下实例使用 /s 将变量 $string 重复的字符删除:
#!/usr/bin/perl
$string = 'runoob';
$string =~ tr/a-z/a-z/s;
print "$string\n";
执行以上程序输出结果为:
runob
更多实例:
$string =~ tr/\d/ /c; # 把所有非数字字符替换为空格
$string =~ tr/\t //d; # 删除tab和空格
$string =~ tr/0-9/ /cs # 把数字间的其它字符替换为一个空格。
正则表达式量词
最大 | 最小 | 占有 | 允许范围 |
{MIN,MAX} | {MIN,MAX}? | {MIN,MAX}?+ | 必须至少出现MIN次,但是不超过MAX次 |
{MIN,} | {MIN,}? | {MIN,}?+ | 必须至少出现MIN次 |
{COUNT} | {COUNT}? | {COUNT}?+ | 必须正好匹配COUNT次 |
* | *? | *+ | 0或多次 (等同于{0,}) |
+ | +? | ** | 1或多次 (等同于{1,}) |
? | ?? | ?+ | 0或1次(等同于{0,1}) |
元符号表
符号 | 原子性 | 含义 |
… | 可变 | 使下一个字母数字字符为元字符,或者(可能)使下一个非字母数字字符不作为元字符 |
…|… | 否 | 候选(匹配一个或另一个) |
(…) | 是 | 分组(当做一个单元) |
[…] | 是 | 字符类(匹配一组中的字符) |
^ | 否 | 如果在字符串开头(或者可能在某个换行符后面)则为true |
. | 是 | 匹配一个字符(正常情况下除换行符以外) |
$ | 否 | 如果在字符串末尾(或者可能在某个换行符前面)true |
扩展正则表达式序列
扩展 | 原子性 | 含义 |
(?#…) | 否 | 注释,丢弃 |
(?:…) | 是 | 非捕获组 |
(?>…) | 是 | 占有组,不捕获也不回溯 |
(?adlupimsx-imsx) | 否 | 启用/禁用模式修饰符 |
(?^alupimsx) | 否 | 重置和启用模式修饰符 |
(?adlupimsx-imsx:…) | 是 | 只用于分组的小括号,以及启用/禁用修饰符 |
(?^alupimsx:…) | 是 | 只用于分组的小括号,以及重置和启用修饰符 |
(?=…) | 否 | 如果前瞻断言成功则为true |
(?!..) | 否 | 如果前瞻断言失败则为true |
(?<=…) | 否 | 如果后顾断言成功则为true |
(?<!..) | 否 | 如果后顾断言失败贼为true |
(?|…|…|…) | 是 | 为编号分组重置分支 |
(?…) | 是 | 命名捕获分组,也记为(?‘NAME’…). |
(?{…}) | 否 | 执行嵌入的Perl代码 |
(??{…}) | 是 | 匹配嵌入Perl代码中的正则表达式 |
(?NUMBER) | 是 | 调用组NUMBER中的独立子表达式,也记作(?+NUMBER), (?-NUMBER), (?0)和(?R)。要确保这里不能使用&字符 |
(?&NAME) | 是 | 在组NAME上递归,确保这里一定要用&字符。另外可以写作(?P>NAME) |
(?(COND)…|…) | 是 | 匹配if-then-else模式 |
(?(COND)…) | 是 | 匹配if-then模式 |
(?(DEFINE)…) | 否 | 为完成后面的"正则表达式子例程"调用,将命名组定义为(?&NAME) |
(*VERB) | 否 | 回溯控制动词,也写作(*VERB::NAME) |
字母数字正则表达式元符号
符号 | 原子性 | 含义 |
\o | 是 | 匹配字符数字0(U+0000,NULL, NUL) |
\ NNN | 是 | 匹配用八进制给定的字符,最大为\377 |
\ n | 是 | 匹配第n个捕获组(十进制) |
\a | 是 | 匹配警报字符(ALERT,BEL) |
\A | 否 | 在字符串开头时为true |
\b | 是 | 匹配退格字符(BACKSPACE,BS)(只在字符类中) |
\b | 否 | 在单词边界时为true |
\B | 否 | 不在单词边界时为true |
\c X | 是 | 匹配控制字符Control-X(\cZ, \c[等) |
\C | 是 | |
\d | 是 | 匹配任何数字字符 |
\D | 是 | 匹配任何非数字字符 |
\e | 是 | 匹配转义字符(ESCAPE,ESC, 非反斜线) |
\E | — | 结束大小写(\F, \L, \U)或反斜线(\Q)转换 |
\f | 是 | 匹配换页字符(FORM FEED, FF) |
\F | — | |
\g{GROUP} | 是 | 匹配命名或编号捕获组 |
\G | 否 | 在前一个m//g匹配结束位置时为true |
\h | 是 | 匹配所有水平制表符 |
\H | 是 | 匹配除水平制表符以外的所有字符 |
\k | 是 | 匹配命名捕获分组,也写作\k’NAME’ |
\K | 否 | 使\K左边的文本不匹配 |
\l | — | 只将下一个字符小写(而不是foldcase) |
\L | — | 小写(而不是foldcase)直到\E结束 |
\n | 是 | 匹配换行符(通常为LINE FEED, LF) |
\N | 是 | 匹配除换行符以外的所有字符 |
\N{NAME} | 是 | 匹配命名字符,别名或序列,如\N{greek:Sigma}匹配 “Σ” |
\o{NAME} | 是 | 匹配用八进制给定的字符 |
\p{PRO} | 是 | 匹配任何有命名属性的字符 |
\P{PRO} | 是 | 匹配任何没有命名属性的字符 |
\Q | — | 引用(消元)元字符,直到\E结束 |
\r | 是 | 匹配回车字符(通常是CARRIAGE RETURN, CR) |
\R | 是 | 匹配任何换行字形簇(不在字符类中) |
\s | 是 | 匹配任何空白字符 |
\S | 是 | 匹配任何非空白字符 |
\t | 是 | 匹配制表符(CHARACTER TABULATION, HT) |
\u | — | 只使下一个字符转换为大写(不是整个字符串为大写) |
\U | — | 转为大写(而不是首字母大写),直到\E结束 |
\v | 是 | 匹配任何垂直制表符 |
\V | 是 | 匹配除垂直空白符以外的任何字符 |
\w | 是 | 匹配任何"单词"字符(字母,数字,组合标记和连接符号) |
\W | 是 | 匹配任何非单词字符 |
\x{abcd} | 是 | 匹配用十六进制给定的字符 |
\X | 是 | 匹配字形簇(不在字符类中) |
\z | 否 | 只在字符串末尾为true |
\Z | 否 | 在字符串末尾或可选的换行符前面时为true |