一、正则表达式的定义
就是用某种模式去匹配一类字符串的一个公式。当给定一个正则表达式和字符串,我们可以用力判断给定的字符串是否符合正则表达式的过滤逻辑,也就是我们常说的“匹配”。
我们可以通过正则表达式,从字符串中获取我们想要的特定部分。
二、正则表达式的应用
1、简单模式
如果模式匹配的对象是$_,把模式写在斜线(/)中。若能匹配上,则返回值为1,否则返回值为0。例如:
#!/usr/bin/perl use strict; $_ = "Hello World,you are so beautiful"; if(/you/) {print "it match\n";}
注意:若匹配项中本身含有斜线,则需要使用反斜线。
#!/usr/bin/perl use strict; $_ = "the txt is in D:/Perl/Test"; if(/D:\/Perl\/Test/) {print "it match\n";}
Unicode属性
即使用字符的属性来进行匹配。使用\p{属性名}表示该属性的模式。也可以使用\P{属性}表示匹配不包含属性的部分,与不匹配不一样。
#!/usr/bin/perl use strict; print "-----------case1------------------------\n"; $_ = "Hello,world!Welcome to the Perl field\n"; if(/world!/) {print "there is world! expression\n";} if(/\p{Space}/) {print "there are space in the string\n";} if(/\p{Digit}/) {print "there are digits in the string\n";} print "\n----------------case2------------------\n"; $_ = "In_the_C:/Perl/Test/example1"; print "string is:\n$_\n"; if(/C:\/Perl\/Test/) {print "there is C:/Perl/Test expression\n";} if(/\P{Space}/) {print "there are string not Space found\n";} if(/\P{Digit}/) {print "there are string not digit found\n";}
模式分组
利用小括号来进行字符串的分组。
括号、反斜线、数字编号可以组成捕获组的模式,括号内的内容作为元字符,用反斜线后面加数字表示再次匹配。
/(world)\3/表示匹配:worldworldworldworld
择一匹配,使用竖线来表示匹配时候的“或”
/hello|world/ 能匹配任何包括hello或者world的字符串
#!/usr/bin/perl use strict; $_ = "Hello my World,it's a string\n"; print "string is:\n$_"; if(/Hello (|my) World/) {print "match\n";} $_ = "Hello World,it's a string\n"; print "string is:\n$_"; if(/Hello(|my) World/) {print"match\n";}
正则表达式中的元字符
元字符是一种特殊字符,起通配作用,在它们前面加上反斜杠(\),这些元字符就会失去其特殊含义。
元字符 | 所代表含义 |
. | 匹配除换行符以外的任意字符 |
[a-z0-9] | 匹配集合中任意单个字符 |
[^a-z0-9] | 匹配不在集合中的任意单个字符 |
\d | 匹配单个数字 |
\D | 匹配非数字字符,等效于[^0-9] |
\w | 匹配数字型(字)字符 |
\W | 匹配非数字型(非字)字符 |
元字符 | 所代表的意义 |
\s | 匹配空白字符,如空格,制表符和换行符 |
\S | 匹配非空白字符 |
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
\f | 匹配进制符 |
\b | 匹配退格符 |
\0 | 匹配空值字符 |
元字符 | 所代表的含义 |
\b | 匹配字边界(不在[]中时) |
\B | 匹配非字边界 |
^ | 匹配行首 |
$ | 匹配行尾 |
\A | 匹配字符串开头 |
\z | 匹配字符串或行的末尾 |
\Z | 匹配字符串末尾 |
\G | 匹配前一次m//g |
元字符 | 所代表的含义 |
x? | 匹配0或1个x |
x* | 匹配0或多个x |
x+ | 匹配1或多个x |
(xyz)+ | 匹配1或多个模式xyz |
x(m,n) | 匹配m到n个x组成的值 |
元字符 | 所代表的含义 |
(was|were|will) | 匹配was/were/will之一 |
元字符 | 所代表的含义 |
\12 | 匹配8进制数,直到\377 |
\x811 | 匹配16进制数值 |
\cX | 匹配控制字符,譬如\cC |
\e | 匹配ASCII |
\x{NUMBER} | 匹配以十六进制形式给出的Unicode |
元字符优先级
当模式中含有多种元字符时,根据优先级顺序来判断匹配量
元字符属性 | 示例 |
圆括号(分组或者捕获) | (...),(?....),(ABC) |
量词 | a*,a+,a?,a{n,m} |
错位和序列 | abc,^,$,\A,\b,\z\Z |
择一竖线 | | |
原子 | a,[abc],\d,\1 |
正则表达式的形式
模式匹配:得到“是否匹配”的结果,无其他操作。
形式:m/<regexp>/或/<regexp>/或m?<regexp>?
同匹配操作符一起,用来判断是否匹配后面的字符串,匹配的表达式中,括号部分的匹配项用$标号表示。匹配上,返回值为1,否则为0。
#!/usr/bin/perl use strict; my $string = "This string contains the number 25.11"; my $test = $string =~/-?(\d+)\.?(\d+)/; print $string."\n"; print $test."\n"; my $integerpart = $1; #$1表示模式匹配中第一个括号 my $decimalpart = $2; #$2表示模式匹配中第二个括号 print $integerpart."\n"; print $decimalpart."\n"; print $0."\n"; #$0表示程序本身
模式匹配的选项
选项 | 描述 |
g | 忽略所有可能的模式 |
i | 忽略大小写 |
m | 将串视为多行 |
s | 将串视为单行 |
x | 忽略模式中的空白 |
#!/usr/bin/perl use strict; my @matches = "balata" =~/.a/g; foreach my $item(@matches) { print $item."\n"; } my @matches2 = "balata" =~/.a/; foreach my $item(@matches2) { print $item."\n"; }
my @matches = ("Dea","deb","dEC","DED"); foreach my $item (@matches) { if($item =~/de/i) { print $item."\n"; } } print "-----------------------------\n"; foreach my $item (@matches) { if($item =~/de/) { print $item."\n"; } }
my $var = "We love China\nThat's right"; my $var1 = "We love China and That's right"; if ($var =~ /China.*right/) { print "var matches\n"; } if ($var1 =~ /China.*right/) { print "var1 matches\n"; } print "---------------------------\n"; if ($var =~ /China.*right/s) { print "var matches\n"; } if ($var1 =~ /China.*right/s) { print "var1 matches\n"; }
my $var = "WeloveChina"; if ($var =~/We love China/) { print "matches\n"; } print "---------------------\n"; if ($var =~/We love China/x) { print "matches\n"; }
模式替换:替换操作,返回值为布尔量。同匹配操作符一起,修改被替换的部分,不支持替换成特殊字符。
形式:s/<regexp>/<replacement>或s?<regexp>?<replacement>。
选项 | 描述 |
g | 忽略所有可能的模式 |
i | 忽略大小写 |
m | 将串视为多行 |
s | 将串视为单行 |
x | 忽略模式中的空白 |
e | 替换字符串作为表达式 |
my $var = "0abc1"; $var =~s/[a-zA-Z]+/3*2/e; print $var."\n"; print "-----------------\n"; $var = "0abc1"; $var =~s/[a-zA-Z]+/3*2/; print $var."\n";
模式转化
同模式替换类似,用以弥补模式替换的不足。将string1中的字符依次、逐个替换为string2的字符,返回值为替换的字符数。
形式:tr/<regexp>/<replacement>或tr?<regexp>?<replacement>
my $var = "abcdfghicba"; print $var."\n"; my $result = $var =~tr/abc/def/; print $var."\n"; print $result."\n"; print "-------------------\n"; $var = "abcdefghijklmn"; print $var."\n"; $var =~tr/abcd/ABCD/; print $var."\n";
模式转化的特殊功能
1、大小写互换
$str =~tr/a-zA-Z/A-Za-z/
2、特定字符计数
$str =~tr/0-9/0-9/
选项 | 描述 |
c | 转化所有未指定字符 |
d | 删除所有指定字符 |
s | 多个相同的输出字符缩成一个 |
my $var = "123abc"; print $var."\n"; $var =~tr/0-9/ /c; print $var."\n"; print "--------------------\n"; $var = "123abc"; print $var."\n"; $var =~tr/1b//d; print $var."\n"; print "--------------------\n"; $var = "123abc3abc"; print $var."\n"; $var =~tr/0-9/ /cs; print $var."\n";