perl不匹配,perl正则表达式匹配特定

perl不匹配,perl正则表达式匹配特定,Perl中的模式匹配学习笔记 本文主要介绍Perl中模式匹配的学习笔记本文解释了匹配操作符、模式中的特殊字符、模式匹配选项等等有需要的可以参考一下 一.导言 模式是指字符串中特定的字符序列,由反斜杠:/def/包含,即模式def其用法如下:结合split函数将一个字符串按照一定的模式分割成多个单词:@array=split(//,$ line); 二、匹配运算符=~,~ =~检查匹配是否成功:$ result=$ var=~/ABC/;如果在字符串中找到该模式,它将返回一个非零值,即true如果不匹配,则返回0,即false~事实正好相反这两个运算符适用于条件控制,例如: 复制代码如下: 如果($question=~ /please/) { 打印(‘谢谢你的客气!\ n’); } 否则{ print(‘那不太礼貌!\ n’); } 三模式中的特殊字符 PERL支持模式中的一些特殊字符,可以起到一些特殊的作用 1.特性 表示一个或多个相同的字符,如:/def/指def、deef、deeeeef等它试图匹配尽可能多的相同字符例如,/ab/将匹配abb,而不是字符串abbc中的AB当一行中词与词之间有多个空格时,可以这样划分:@array=split (//,$ line); 注意:split函数每次遇到拆分模式总会开始一个新词,所以如果$line以空格开头,那么@array的第一个元素就是空元素但是,它可以区分是否有真实的单词如果$line中只有空格,@array就是空数组上面示例中制表符被视为一个单词注意纠正 2.字符[]和[] []表示匹配一组字符中的一个,如/a[0123456789]c/将匹配一个加号加c的字符串.结合例子:/d[eE] f/匹配def,dEf,deef,dEef,dEEEeeeEef等表示除它之外的所有字符,例如:/d[dee]f/一个匹配d加非e字符加f的字符串 3.字符*和? 它们类似于,除了*匹配0、1或更多相同的字符匹配0或1个字符比如/de*f/匹配df,def,deeeef等/de?F/匹配df或def 4.转义字符 如果要在模式中包含通常被视为特殊含义的字符,必须在前面加一个斜杠' '例如,\ * in/\ */表示字符*而不是上面提到的一个或多个字符的意思斜杠表示为/\ \/在PERL5中,字符对\Q和\E可以用于转义 5、匹配任意字母或数字 上述模式/a[0123456789]c/匹配字母A加任意数加C的字符串,另一种表示为:/a[0-9]c/同样,[a-z]代表任何小写字母,[A-Z]代表任何大写字母任意大小写字母和数字的表达式为:/[0-9a-zA-Z]/ 6.锚模式 锚点描述 Or \A只匹配字符串的开头 $或\Z仅匹配字符串的结尾 \b匹配单词边界 \B单词内部匹配 示例:/^def$/只匹配以def开头的字符串,/$def/只匹配以def结尾的字符串,组合/def $/只匹配字符串def(?)当多行匹配时,\A和\Z不同于和$ 示例2:检查变量名的类型: 复制代码如下: if($ varname=~ /^\$[a-za-z][_0-9a-za-z]*$/){ print ('$varname是合法的标量变量\ n '); }埃尔西弗($ varname=~ /^@[a-za-z][_0-9a-za-z]*$/){ print ('$varname是合法的数组变量\ n '); }埃尔西弗($ varname=~ /^[a-za-z][_0-9a-za-z]*$/){ print ('$varname是合法的文件变量\ n '); }否则{ print('我不明白$varname是什么\ n’); } 示例:\ b匹配单词边界:/\bdef/匹配以def开头的单词,如def和defghi,但不匹配abcdef/def\b/匹配以def结尾的单词,如def和abcdef,但不匹配defghi/\bdef\b/仅匹配字符串def注意:/\bdef/可以匹配$defghi,因为$不被视为单词的一部分 示例4: \ b匹配单词:/\ Bdef;/匹配abcdef等,但不匹配def/def\B/matches defghi等/\Bdef\B/匹配cdefg、abcdefghi等但与def,defghi,abcdef不匹配 7.模式中的变量替换 把句子分成单词: $ pattern='[\ \ t]'; @words=split(/$pattern/,$ line); 8.字符范围的转义 转义字符描述范围 \d任何数字[0-9] \D除数字[0-9]以外的任何字符 \w任何单词字符[_0-9a-zA-Z] \W任何非单词字符[_ 0-9a-za-z] \s空白[\r\t\n\f] \S不为空[\ r \ t \ n \ f] 示例:/[\da-z]/匹配任何数字或小写字母 9.匹配任何字符 字符“.”匹配除换行符之外的所有字符,通常与*结合使用 10、匹配指定数目的字符 为字符{}指定匹配字符的出现次数如:/de{1,3}f/匹配def,deef,DEEF;/de { 3 } f/matching deeef;/de{3,}f/匹配d和f之间至少3个e;/de{0,3}f/匹配d和f之间不超过3个e 1.指定选项 字符“|”指定两个或更多选项来匹配模式例如/def|ghi/matches def或ghi 例子:检查数字的合法性 如果($number=~ /^-?\d $|^-?0[xX][\da-fa-F] $/) { ($number是一个合法的整数\ n’); }否则{ print ('$number不是合法的整数\ n’); } 其中有-?\d $匹配十进制数字,-?0[xX][\da-fa-F] $匹配十六进制数字 12.模式的部分重用 当模式中的同一部分出现多次时,可以用括号括起来,并用\n多次引用,以简化表达式:/\d{2}([\W])\d{2}\1\d{2}/match: 12-05-92 26.11.87 7 04 92等 注意:/\d{2}([\W])\d{2}\1\d{2}/不同于/(\d{2})([\W])\1\2\1/,后者只匹配17-17-17的形状 13.转义和特定字符的执行顺序 像运算符一样,转义符和特定字符也有执行顺序: 特殊字符描述 ()模式存储器 * ?{}出现次数 $ \ b \ b锚点 |选项 14.指定模式分隔符 默认情况下,模式分隔符是反斜杠/,但也可以用字母M来指定,例如: m!/u/jqpublic/perl/prog1!相当于/\/u\/jqpublic\/perl\/prog1/ 注意:当使用字母'作为分隔符时,不进行变量替换;当使用特殊字符作为分隔符时,不能使用其转义函数或特殊函数 15.模式顺序变量 模式匹配后,调用复用部分的结果可以是变量$n,所有的结果都可以是变量$ n 复制代码如下: $string='该字符串包含数字25.11'; $string=~ /-?(\d )\(\ d)/;#匹配结果为25.11 $ integer part=$ 1;#现在$integerpart=25 $ decimal part=$ 2;#现在$decimalpart=11 $ totalpart=$#现在总计部分=25.11 四模式匹配选项 选项描述 g匹配所有可能的模式 我忽略案例 将m字符串视为多行 o只赋值一次 将s字符串视为一行 忽略X模式中的空白 1.匹配所有可能的模式(选项G) 复制代码如下: @matches='balata'=~ /a/g;# now @matches=('ba ',' la ',' ta ') 匹配循环: while ('balata'=~ /a/g) { $ match=$ print(' $ match \ n '); } 结果是: 复制代码如下: 文学士 长音阶全音阶的第六音 谢谢 当使用选项G时,下一个匹配的偏移可以由功能pos: 复制代码如下: $ offset=pos($ string); pos($ string)=$ new offset; 2.忽略大小写(I选项)示例 /de/i匹配dE,De,de,DE,DE 3.将字符串视为多行(M选项) 在这种情况下,符号匹配字符串的开头或新行的开头;$符号匹配任何行的结尾 4.仅执行一次变量替换 复制代码如下: $ var=1; $ line=; while ($var 10) { $ result=$ line=~/$ var/o; $ line=; $ var } 每次都匹配/1/ 5.将该字符串视为单行示例 /a.*bc/s匹配字符串axxxxx

\nxxxxbc,但是/a.*bc/与该字符串不匹配。

6.忽略图案中的空格。

/\d{2} ([\W]) \d{2} \1 \d{2}/x相当于/\d{2}([\W])\d{2}\1\d{2}/。

动词(verb的缩写)替换操作员

语法是s/pattern/replacement/,其作用是用replacement替换字符串中与模式匹配的部分。比如:

复制代码如下:

$ string=' abc123def

$ string=~ s/123/456/;# now $ string=' abc456def

模式顺序变量$n,如s/(\d )/[$1]/,可用于替换部分,但模式的特殊字符,如{}、*等。替换零件中不支持。例如,s/abc/[def]/将用[def]替换abc。

替换操作员的选项如下:

选项描述

g更改模式中的所有匹配项。

我忽略模式中的大小写。

e将字符串替换为表达式。

m将待匹配的字符串视为多行。

o只赋值一次。

s将待匹配的字符串视为一行。

忽略X模式中的空白

注意:e选项将替换零件的字符串视为表达式,并在替换前计算其值,例如:

复制代码如下:

$ string=' 0abc1

$ string=~ s/[a-zA-Z]/$ x ^ 2/e;#现在$string='0abcabc1 '

不及物动词翻译运算符

这是另一种选择,语法如tr/string1/string2/。同样,string2也是替换部分,但它的作用是用string2中的第一个字符替换string1中的第一个字符,用string2中的第二个字符替换string1中的第二个字符,以此类推。比如:

$ string=' abcdefghicba

$ string=~ tr/ABC/def/;# now string='defdefghifed '

当string1长于string2时,其冗余字符被string2的最后一个字符替换;当同一个字符在string1中出现多次时,将使用第一个替换字符。

翻译运算符的选项如下:

选项描述

翻译所有未指定的字符

删除所有指定的字符。

将多个相同的输出字符减少为一个。

如$ string=~ tr/\ d//c;用空格替换所有非数字字符。$ string=~ tr/\ t//d;删除制表符和空格;$ string=~ tr/0-9//cs;用空格替换数字之间的其他字符。

七。扩展模式匹配

它支持PERL 4和标准UNIX模式匹配操作所不具备的一些模式匹配功能。它的语法是:(?模式),其中C是字符,模式是功能模式或子模式。

1.不要将匹配的内容存储在括号中。

在PERL的模式下,括号中的子模式会存储在内存中,所以这个函数取消了括号中匹配内容的存储,比如/(?\1 in: a|b|c)(d|e)f\1/表示匹配的d或e,而不是a或b或c。

2.嵌入式模式选项

通常接下来是模式选项,有四个选项:I、M、S和X可以内联使用。语法是:/(?Option)pattern/,相当于/pattern/option。

3.正反前瞻匹配。

肯定预测匹配的语法是/pattern(?=string)/,表示匹配模式后跟string。相反,(?String)表示匹配不在字符串后面的模式,例如:

复制代码如下:

$ string=' 25abc8

$string=~ /abc(?=[0-9])/;

$ matched=$# $是匹配的模式,这里是abc,不是abc8。

4.模式注释

PERL5可以用在模式中吗?#添加注释,例如:

复制代码如下:

if ($string=~ /(?i)[a-z]{2,3}(?#匹配两三个字母字符)/{

.

}

摘要如下:

在字处理方式中,/模式/常用语法

/模式/

结果。

查找除换行符之外只有一个字符的字符串。

x?

寻找0或1个字符。

x*

查找0个或多个X字符。*

查找0个或更多字符。

x

查找0个或多个X字符。

查找一个或多个字符。

{m}

精确查找m个指定的字符。

{m,n}

查找m个以上n个以下的指定字符。

{m,}

查找m个以上的指定字符。

[]

查找匹配[]的字符

[^]

查找不匹配[]的字符

[0-9]

查找0到9之间的任意字符。

[a-z]

查找匹配A到z的任何字符。

[^0-9]

查找任何与0到9不匹配的字符。

[^a-z]

查找任何不匹配A到z的字符。

^

找到字符开头的字符。

$

找到字符末尾的字符

\d

查找一个数字字符,与[0-9]语法相同。

\d

查找digit以上的字符串,与[0-9]语法相同。

\D

找一个非数字字符,和[0-9]语法一样。

\D

查找非数字上面的字符,这与[0-9]语法相同。

\w

找到一个英文字母或数字字符,与[a-zA-Z0-9]语法相同。

\w

查找多个英文字母或数字字符,与[a-zA-Z0-9]语法相同。

\W

找到一个非英文字母,数字字符,与[a-za-z0-9]语法相同。

\W

查找多个非英语字母、数字字符,与[a-za-z0-9]语法相同。

\s

查找空白字符,与[\n\t\r\f]相同

\s

查找多个空白字符,与[\n\t\r\f]相同

\S

查找非空白字符,与[\ n \ t \ r \ f]相同

\S

查找多个非空白字符,如[\ n \ t \ r \ f]

\b

查找不受英文字母和数值限制的字符串。

\B

找出一个以英文字母和数字为边界的字符串。

a|b|c

查找与A字符、B字符或C字符匹配的字符串。

字母表

找到包含abc的字符串

(模式)

这个符号()可以记住找到的字符,是一个非常实用的语法。

在第一个()中找到的字符串成为变量$1或\1。

在第二个()中找到的字符串成为变量$2或\2。

以此类推,笔者将在下一节详细介绍其用法。

/模式/i

这个I参数意味着忽略英语的大小写,也就是说,在查找一个字符串时,不会考虑英语的大小写。

\

如果要在图案图样中找到一个有特殊含义的字符,就要在这个字符前加上符号\,这样这个特殊字符就失效了。

两种文字处理模式的简单示例(正则表达式)

看了上一节的文字处理模式(正则表达式),初学者可能对这个语法的应用不是很清楚,所以我在这一节给大家举几个文字处理模式常用的例子:

模型

解释

/perl/

找到包含perl的字符串。

/^perl/

找到一个以perl开头的字符串。

/perl$/

查找以perl结尾的字符串。

/c|g|i/

找一个包含C或G或I的字符串。

/cg{2,4}i/

找出C后面跟着2到4 G后面跟着I的字符串。

/cg{2,}i/

找出C后面跟多于2 G后面跟I的字符串。

/cg{2}i/

找出C后面跟着2 G后面跟着I的字符串。

/cg*i/

找一个C后面跟0或更多G后面跟I的字符串,比如/cg{0,1}i/

/cg i/

找出C后面跟着不止一个G后面跟着C的字符串,比如/cg{1,}i/

/cg?我/

找出C后面跟0或者a G后面跟C的字符串,比如/cg{0,1}i/

/c.i/

找出C后面跟一个任意字符再跟一个I的字符串。

/c.我/

找出C后面跟两个任意字符,后面跟I的字符串。

/[cgi]/

查找与这三个字符中的任意一个匹配的字符串。

/[^cgi]/

找到一个不含这三个字符的字符串。

/\d/

查找与数值匹配的字符串。

您可以使用/\ d/来表示一个或多个数字字符串。

/\D/

查找与非数值匹配的字符串。

您可以使用/\ D/来表示一个或多个非数字字符串。

/\w/

查找与英文字母和值匹配的字符串

您可以使用/\ w/来表示由一个或多个英文字母和值组成的字符串。

/\W/

查找匹配非英语字母和数字字符的字符串

您可以使用/\ W/来表示由一个或多个非英文字母和数值组成的字符串。

/\s/

查找与空格匹配的字符串。

您可以使用/\ s/来表示一个或多个空白字符的字符串。

/\S/

查找非空的字符串。

您可以使用/\ S/来表示由一个或多个非空白字符组成的字符串。

/\*/

寻找与符号*匹配的字符串,因为*在字处理模式下有其特殊含义,所以在这个特殊符号前加上符号\,会使这个特殊字符无效。

/abc/i

查找与abc匹配的字符串,不考虑这些字符串的大小写。

3.与正则表达式相关的运算符和函数

=~还有!经常在perl编程中使用。~这两个运算符与函数S和T配合文字处理模式/模式/组成表达式。如果能灵活运用这些指令,就非常容易了。要轻松处理一些字符串,当然在CGI编程中更得心应手。现在让作者介绍一下这些运算符和函数的用法:

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: