1、Perl正则表达式简介
-
正则表达式的起源
1956年,论文《神经网络事件的表示法》首次提出“正则集的代数”表达式
英文名:regular expression
Ken Thompson将正则表达式引入Unix
此后广泛应用于Unix或者类Unix工具中
主流操作系统、主流开发语言都嵌入了正则表达式
-
正则表达式的定义
- 正则表达式,就是用某种模式去匹配一类字符串的一个公式
-
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
给定的字符串是否符合正则表达式的过滤逻辑(称作为“匹配”)
可以通过正则表达式,从字符串中获取我们想要的特定部分
-
常用工具中的正则表达式
记事本中的正则表达式:查找、替换实际上就是正则表达式
World中正则表达式:查找、替换
Vi中的正则表达式:查找、替换
-
正则表达式无处不在
-
不同环境中所支持的功能可能不太一样
-
-
正则表达式的特点
灵活性、逻辑性和功能性非常的强
主要应用对象是文本
可以迅速的用极简单的方式达到字符串的复杂控制
对于刚接触的人来说。比较晦涩难懂
2、Perl正则表达式的应用
-
正则表达式的语法
一个正则表达式也称为一个模式
-
简单模式
如果模式匹配的对象是$_,把模式写在斜线/中
能匹配上,返回值为1,否则为0
$_ = "hello World"; if(/"World"/) {printf"It matched"};
如果匹配项本身含有斜线,使用反斜线
-
Unicode属性
利用字符的属性进行匹配
\p{属性名}表示该属性的模式
匹配空格,使用Space属性:\p{Space}
匹配数字,使用Digit属性:\p{Digit}
匹配十六进制数,使用Hex属性:\p{Hex}
也可以使用\P来表示匹配不包含属性的部分,\P{属性},同不匹配不一样
-
模式分组
利用小括号来进行字符串的分组
括号、反斜线、数字编号可以组成捕获组的模式
括号内的内容作为元字符,用反斜线后面加数字表示再此匹配
反斜线也不一定在括号后面
/(world)\3/表示匹配:worldworldworldworld
择一匹配,使用竖线|表示匹配时候的”或“
/(hello|world)/表示匹配“hello”或“world"
-
正则表达式的应用场合
针对所有的字符串处理,如特定字符串、重复、计数、统计等
电话号码匹配
姓名,邮箱匹配
3、Perl正则表达式和元字符
-
正则表达式中的元字符
元字符是一种特殊字符
起通配作用
在他们前面加上反斜杠\,这些元字符就会失去其特殊含义
-
元字符列表
-
字符类:单字符与数字
-
字符类:空白字符
-
字符类:锚定字符
-
字符类:重复字符
-
字符类:替换字符
-
字符类:其他字符
-
-
元字符的优先级
-
当模式中包含多种元字符时,根据优先级顺序来判断匹配量
-
4、Perl正则表达式的形式
-
模式匹配
得到“是否匹配”的结果,无其他操作
形式为:m/<regexp>/; 或者/<regexp>/; 或者m?<regexp>?
同匹配操作符一起,用来判断是否匹配后面的字符串
匹配的表达式中,括号部分的匹配项用$标号表示
匹配上,返回值为1,否则为0
$test = "China"; $target = ".*ina"; $test =~ m/$target/ ##该表达式的返回值为1
$string = "This string contains the number 25.11"; $test = $string =~ /?(\d+)\.?(\d+)/; print $string."\n"; ## This string contains the number 25.11 print $test."\n"; ## 1 $a = $1; $b = $2; print $a."\n"; ## 25 print $b."\n"; ## 11
-
模式匹配的选项:
-
模式替换
替换操作,返回值为布尔值
形式为:s/<regexp>/<replacement>; 或者s?<regexp>?<replacement>
同匹配操作符一起,修改被替换的部分
不支持替换成特殊字符
-
模式替换的选项
$var = "0abc1"; $var =~ s/[a-zA-Z]+/3*2/e; print $var."\n"; ## 061 $var =~ s/[a-zA-Z]+/3*2/; print $var."\n"; ## 03*21
-
模式转化
同模式替换类似,用以弥补模式替换的不足
形式为:tr/<regexp>/<replacement>; 或则tr?<regexp>?<replacement>
将string1中的字符依次,逐个替换为string2的字符
-
返回值为替换的字符数
$var = "abcdfghicba"; print $var."\n"; ## abcdfghicba $result = $var =~ tr/abc/def/; print $var."\n"; ## defdfghifed print $result."\n"; ## 6 print "------------------------\n";
-
模式转换的特殊功能
大小写转换:$str =~ tr/a-zA-Z/A-Za-z/
特定字符的计数:$str =~ tr/0-9/0-9/
-
模式转换的选项
$var = "123abc"; print $var."\n"; ## 123abc $var =~ tr/0-9/ /c; print $var."\n"; ## 123 $var =~ tr/1b//d; print $var."\n"; ## 23ac $var = "12abc3abc"; $var =~ tr/0-9/ /cs; print $var."\n"; ## 12 3
5、Perl正则表达式的原则
-
原则一:
- 正则表达式有三种不同形式,分为匹配,替换和转化
-
原则二:
- 正则表达式仅对标量进行匹配
-
原则三:
- 匹配时,默认只匹配/替换一次,且对象为最早的可能匹配
-
原则四:
- 正则表达式能够处理双引号所能处理的任意和全部字符
-
原则五:
正则表达式在求值过程中产生两种情况:结果状态和反向引用
$a =~ m/pattern/ ##产生的结果状态,布尔类型
$a =~ s/(word1)(word2)/$2$1/ ##产生的反向引用
-
原则六:
正则表达式的核心能力在于通配符和多重匹配运算符
$a =~ /\w+/ ##匹配一个或多个单词
$a =~ m/\d/ ##匹配0个或多个数字
-
原则七:
如果匹配不止一个字符集合,可以使用“|”来增加灵活性
m/(cat|dog)/ ##可以匹配cat或者dog
-
原则八:
Perl中用(?...)语法给正则表达式提供扩展功能
(?:pattern) 匹配pattern但不获取匹配结果
(?=pattern) 正向预查,在任何匹配pattern的字符串开始处匹配查找字符串
(?!pattern) 负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串
-
说明:
- 在Perl的模式中,括号内的子模式将存储在内存中,此功能即取消存储该括号内的匹配内容