志在指尖
用双手敲打未来

perl正则表达式(正则表达式的用法)

perl正则表达式

perl的正则表达式有三种方式:匹配,替换和转化。
匹配:m//(还能够简写为//,略去m)
替换:s///
转化:tr///
这三种方式一般都和=~或!~调配运用,=~表明相匹配,!~表明不匹配。
一.匹配
匹配操作符m//用于匹配一个字符串句子或许一个正则表达式,运用=~符号表明要用右边的正则表达式对左面的数据进行匹配,匹配回来真,否则回来假,m能够省掉,缩写为//。
如果想要输出匹配到的内容,能够运用特别变量$&来引证匹配到的内容,还能够运用$`引证匹配前面部分的内容,$’引证匹配后边部分的内容。
my$str1=”AbcgggBbCcbggggA”;#匹配到第一个ggg就结束if($str1=~/ggg/)
{#如果想要输出匹配到的内容,能够运用特别变量$&来引证匹配到的内容,还能够运用$`引证匹配前面部分的内容,$’引证匹配后边部分的内容print”匹配到的内容:$&\n”;#输出gggprint”匹配前面部分的内容:$`\n”;#输出Abcprint”匹配后边部分的内容:$’\n”;#输出BbCcbggggA}else{print”没有匹配到”;perl

正则表达式的用法

在咱们写页面时,往往需求对表单的数据比方账号、身份证号等进行验证,而最有用的、用的最多的便是运用正则表达式来验证。那什么是正则表达式呢?
正则表达式(RegularExpression)是用于描述一组字符串特征的模式,用来匹配特定的字符串。它的运用非常广泛,特别是在字符串处理方面。其常见的运用如下:
验证字符串,即验证给定的字符串或子字符串是否契合指定的特征,例如,验证是否是合法的邮件地址、验证是否是合法的HTTP地址等等。
查找字符串,从给定的文本当中查找契合指定特征的字符串,这样比查找固定字符串愈加灵敏。
替换字符串,即查找到契合某特征的字符串之后将之替换。
提取字符串,即从给定的字符串中提取契合指定特征的子字符串。
第一部分:正则表达式之东西
正所谓工欲善其事必先利其器!所以咱们需求知道下面几个主要的东西:
http://www.regexpal.com/这个网站中,咱们能够在线测验正则表达式。
http://regexr.com/这个网站更为引荐,它本身还包含了一个实例使咱们直接测验。
第二部分:正则表达式之元字符
正则表达式中元字符恐怕是咱们听得最多的了。元字符(Metacharacter)是一类非常特别的字符,它能够匹配一个方位或许字符调集中的一个字符。如.、\w等都是元字符。
刚刚说到,元字符既能够匹配方位,也能够匹配字符,那么咱们就能够经过此来将元字符分为匹配方位的元字符和匹配字符的元字符。
A匹配方位的元字符—^、$、\b
即匹配方位的元字符只要^(脱字符号)、$(美元符号)和\b这三个字符。分别匹配行的开端、行的完毕以及单词的开端或完毕。它们匹配的都仅仅方位。
1.^匹配行的开端方位
如^zzw匹配的是以”zzw”为行最初的”zzw”(留意:我这儿想要表达的是:尽管加了一个^,它匹配的仍是字符串,而不是一整行!),假如zzw不是作为行最初的字符串,则它不会被匹配。
2.$匹配行的完毕方位
如zzw$匹配的是以”zzw”为行完毕的”zzw”(相同,这儿$仅仅匹配的一个方位,那个方位是零宽度,而不是一整行),假如zzw不是作为行的完毕,那么它不会被匹配。
所以结合^和$咱们就不难猜测^zzw$匹配的是某行中只要zzw这个字符串了。
而^$匹配的则是一个空行,这个空行中不包含任何字符串。perl1
3.\b匹配单词的开端或完毕
如\bzzw匹配的是zzw之前是空格符号、标点符号或换行符号的zzw(留意:但\b匹配的仅是一个零宽度的方位,而不会匹配空格、标点符号或换行符号)。
而zzw\b匹配的是zzw之后是空格符号、标点符号或换行符号的zzw(相同,\b匹配的是一个零宽度的方位)。
明显\bzzw\b匹配的便是zzw的前后有必要是空格符号、标点符号或换行符号的zzw。
B匹配字符的元字符—.、\w、\W、\s、\S、\d、\D
即匹配字符的元字符共有七个。
其间.(点号)表明匹配除换行符之外的恣意字符;
\w匹配单词字符(不仅仅是字母,还有下划线、数字和汉字);\W匹配恣意的非单词字符(留意,与\w刚好相反);
\s匹配的是恣意的空白字符(如空格、制表符、换行符、中文全角空格等);
\S匹配的是恣意的非空白字符(留意:刚好和\s相反);
\d匹配恣意的数字;
\D匹配恣意的非数字字符(留意:刚好和\d相反)。
比方如下所示:
上面的四个比方从左到右顺次表明:
^.$表明匹配一行中的仅有一个恣意的非换行符的字符
\ba\w\w\w\w\w\w\w\w\w\b表明匹配以字母a开端的后边有9个字母字符的单词。(留意:其间的a并不是元字符,便是一个普通的字符,咱们称之为字符串字面值(stringliteral)-所谓字符串字面值,便是字面上看起来是什么便是什么)
\b\w\w\w\d\d\d\d\D\b表明匹配以3个字母字符开端后边紧跟着四个数字字符且最终一个不是数字字符的单词。
第三部分:正则表达式之文字匹配
这一部分咱们将经过字符类、字符转义、反义这几个部分来学习。
A、字符类
字符类是正则表达式中的“迷你”言语,能够在[]中界说。
最简略的字符类能够由[]和几个简略的字母组成。比方[aeiou]能够匹配aeiou五个字母中的恣意一个。[0123456]能够匹配0123456这七个数字中的恣意一个。而能够匹配到HTML符号中的
中的恣意一个符号。而[bhc]at就会匹配字符串bat、hat、cat。也便是说字符类[]中的多个字符只会匹配其间一个。
可是明显[0123456]、这样的表明太费事,需求写的许多,所以咱们能够运用-连字符)来简写之,如[0-6]和。所以可知[0-9]和\d的作用是相同的。[a-z]能够表明一切的小写字母,[A-Z]能够表明一切的大写字母。[a-zA-Z]能够表明一切的大写字母和小写字母。
值得留意的是-(连字符)只要在字符类中的中间方位时才是“到”的意思。而[-b]5中-没有在两个字符之间,所以它表明的是-5或许b5。
除此之外,咱们知道^时只匹配行的最初,可是假如^出现在字符类中的第一个方位,那么它表明否定该字符类。如[^123]表明匹配不是数字1或2或3的其他恣意字符。[^-]表明匹配不是-的恣意字符。
由此咱们也能够发现:在字符类中运用元字符(-、^等)时,不需求进行转义运算。
更常用的有[^aeiou]匹配元音之外的字符、[0-9a-zA-Z_]匹配任何数字、字母(大写和小写)和下划线,这等同于\w、[^0-9a-zA-Z_]匹配任何非数字、字母(大写和小写)和下划线,这等同于\W。
B、字符转义
咱们知道元字符如&、^、.等都表明着特别的寓意,假如咱们期望把他们看作一般的字符去匹配字符串,并且恰好他们又都不在字符类(如[&]中),咱们就需求运用\(反斜杠)进行转义了。
如咱们能够运用www.jb51.net来匹配www.jb51.net。咱们能够用\*来匹配字符串中的*(通配符)。咱们还能够经过\\来匹配\。举例如下所示:
C.反义
实际上咱们在前面已经说过了,这儿再说一遍是因为期望能够引起留意,即^再字符类中的最前面时表明对这个字符类中的字符表明否定。如a[^b]匹配a和a后边不是b的字符。又如]>表明匹配的字符。举例如下:
第四部分:正则表达式之限定符
什么是限定符呢?咱们知道,在前面的比方中,我曾经运用过\ba\w\w\w\w\w\w\w\w\w\b表明匹配以字母a开端的后边有9个字母字符的单词,明显这样写是非常费事的,假如咱们能把\w这些重复的用简略的形式来写就好了~没错,限定符便是干这个的,利用限定符咱们能够重新写成\ba\w{9}\b。对,便是这么简略!下面让咱们了解更多吧。
{n}表明重复n次,如\w{5}表明匹配个单词字符。
{n,}表明重复至少n次,如\w{5}表明匹配至少5个单词字符,也能够是6个,7个……
{n,m}表明重复至少n次,最多m次,如\w{5,10}表明匹配至少5个,最多10个单词字符。
*表明重复至少0次。等同于{0,},即hu*t能够匹配ht或hut或huut或huuut……
+表明重复至少1次。等同于{1,},即hu+t能够匹配hut或huut或huuut……
?表明重复0次或1次。等同于{0,1},即colou?r表明匹配color或许是colour。
明显,上面的限定符所指的i安定都是限定的前面的某一个字符。
可是,假如咱们在上面的限定符之后加上一个?呢,这时咱们称之为懒惰限定符。相应地,咱们称上面几种匹配为贪婪匹配。
{n}?等同于{n}
{n,}?尽或许少的运用重复,但至少运用n次
{n,m}?重复n次到m次之间,但要尽或许少的运用重复。
*?尽或许少的运用重复的第一个匹配
+?尽或许少的运用重复,但至少运用1次
??运用零次重复(假如有或许)或许一次重复
比方:关于aabab这个要匹配的字符串而言,运用a.*b会匹配aabab,而假如运用a.*?b就会匹配aab和ab,而不是匹配一切。
第五部分:正则表达式之字符的运算
字符的运算包含替换、分组和反向引证,下面我将逐项介绍。
A替换
什么是替换呢?明显便是指一个不可,我用另一个来替换,比方0\d{3}-\d{7}|0\d{2}-\d{8}就表明匹配前4位为区号、后7位为本地号码的电话号码,亦可匹配前3位为区号、后8位为本地号码的电话号码。|表明的便是替换了。又如[Jj]ack和Jack|jack的匹配效果是相同的都是用来匹配Jack或jack的。也便是说,替换|是或运算的联系。
在一般的或运算中00结果为0,01结果为1,10结果为1,11结果为1。那么在正则表达式中相同是这样,假如一个都匹配不上就不匹配;假如有一个能匹配上就匹配一个;假如两个都能匹配上,就匹配两个。举例如下所示:
B.分组
正则表达式中,分组也是一个非常重要的概念。看似杂乱,实际上分组便是运用”(“和”)”,即左圆括号和右圆括号将某些字符括起来看成一个整体来处理。
比方咱们期望匹配abcabc。假如是abc{3}匹配的便是abccc,这不能达到预期,所以咱们能够对abc分组,即(abc){3}就能够匹配到咱们想要的字符串了。
又如(\d{1,3}\.){3}\d{1,3}也用了分组的运算方式,它能够用来匹配简略的IP地址,如下所示:
C反向引证
上面咱们经过()能够进行分组,而分组的一起,每一个组被自动赋予了一个组号,该组号能够代表该组的表达式。
编组的规则是:从左到右、以分组的左括号”(“为标志,第一个分组的组号为1,第二个分组的组号为2,以此类推。
这时,反向引证就派上用场啦。咱们就能够用它来反向引证运用()括起来的字符组了。详细怎样引证呢?规则如下:
\数字,运用数字命名的反向引证。注:这个是通用的一种方式。
\k,运用指定命名的反向引证。注:这个是.NETFrameword支撑的一种方式。
下面的几个比方是运用数字命名的反向引证:
其间咱们能够看到第一个和第二个匹配的并不相同—第一个匹配的是两个恣意单词字符组成的单词,而第二个由所以运用了反向引证,那么它就有必要是两个重复单词字符组成的单词。
最终一个我运用了两个分组,依据分组规则可知\w{3}\d{2}是第一个分组,\d{2}是第二个分组。相同留意:反向引证的是相同的字符,如www55www5566,最终两位不同,这就无法正确匹配了。
运用指定命名(也便是自界说命名)的反向引证
关于上面的第二个比方,咱们用自界说命名的反向引证能够写成\b(?\w)\k\b或许是\b(?’myName’\w)\k\b。本想举例试一下,结果都提示过错,或许是上面说到的两个在线网站不支撑吧~
当然,假如咱们期望仅仅将之看作一个整体,而不期望给其编号,能够运用(?:expression)的方式。如下所示:
别的,下面几个也是常用的分组:
(?=expression)匹配字符串expression前面的方位
(?!expression)匹配后边不是字符串expression的方位
(?<=expression)匹配字符串expresssion后边的方位
(?
(?>expression)只匹配字符串expression一次
D.零宽度断语
之前介绍的^和$都是匹配的一个满意必定条件的方位。这儿把满意的一个条件成为断语或零宽度断语。
常用的有:
^匹配行的开端方位
$匹配行的完毕方位
\A匹配有必要出现在字符串的最初
\Z匹配有必要出现在字符串的完毕或字符串完毕处的\换行符好n之前
\z匹配有必要出现在字符串的完毕
\G匹配有必要出现在上一个匹配完毕的当地
\b匹配字符的开端或完毕方位
\B匹配不是在字符的开端或完毕方位
之前所说到的(?=expression)、(?!expression)、(?<=expression)、(?
其间(?=expression)称为零宽度预测先行断语,它断语本身方位的后边能够匹配表达式expression。如\b\w+(?=ed\b)能够匹配以字符串ed完毕的单词的前面部分,如reseted中的reset。
其间(?<=expression)又称为零宽度正回顾后发断语,它断语本身方位的前面能够匹配表达式expression。如(?<=\ban)\w+\b能够匹配除字符串an之外的部分。
E负向零宽度断语
(?!expression)称为负向零宽度断语,即断语本身方位的后边不能匹配字符串expression。
如\b\w{3}(?!\d)匹配的是后边不是数字的以三个单词字符最初的三个单词字符。如下所示:
F优先级次序
正则表达式中存在元字符、转义符、限定符、|等运算或表达式。在匹配过程中,正则表达式都事先规则了这些运算或表达式的优先级。正则表达式也能够像数学表达式相同来求值。也便是说,正则表达式能够从左到右、并依照一个给定的优先级来求值。
优先级次序表(优先级由高到低)如下:
转义符:\
圆括号和方括号:()、(?:)、(?=)、[]
限定符:*、+、?、{n}、{n,}、{n,m}
方位和次序:^、$、\(元字符)
或运算:|
咱们能够看到或运算的优先级是最低的。
第六部分:典型正则表达式解释
A匹配windows运算体系的称号
咱们能够经过下面的正则表达式来精确匹配windows运算体系的称号
1
windows\s*((95)|(98)|(2000)|(2003)|(ME)|(XP)|(7)|(8)|(10))
这样就能够精准匹配windows的各种版本的运算体系了,明显这个是非常冗长的,咱们还能够用一种不精准的方式匹配,如下所示:
1
windows\s*\w+
其间s*表明至少重复0次。即windows10(无空格),windows10(一个空格),windows10(两个空格)等都能够正确匹配。
B匹配HTML符号
HTML符号一般由尖括号包围,如、、等等。所以咱们能够运用下面的正则表达式来匹配HTML符号。
1
<[a-zA-Z][^>]*>
到此这篇关于正则表达式用法详解的文章就介绍到这了。期望对我们的学习有所协助,也期望我们多多支撑脚本之家。

未经允许不得转载:IT技术网站 » perl正则表达式(正则表达式的用法)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载