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/defb/匹配以def结尾的单词,如def和abcdef,但不匹配defghi/bdefb/仅匹配字符串def注意:/bdef/可以匹配$defghi,因为$不被视为单词的一部分示例4: b匹配单词:/ Bdef;/匹配abcdef等,但不匹配def/defB/matches defghi等/BdefB/匹配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空白[rtnf]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个e1.指定选项字符“|”指定两个或更多选项来匹配模式例如/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}1d{2}/match:12-05-9226.11.877 04 92等注意:/d{2}([W])d{2}1d{2}/不同于/(d{2})([W])121/,后者只匹配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,DE3.将字符串视为多行(M选项)在这种情况下,符号匹配字符串的开头或新行的开头;$符号匹配任何行的结尾4.仅执行一次变量替换复制代码如下:$ var=1;$ line=;while ($var 10) {$ result=$ line=~/$ var/o;$ line=;$ var}每次都匹配/1/5.将该字符串视为单行示例/a.*bc/s匹配字符串axxxxxnxxxxbc,但是/a.*bc/与该字符串不匹配。
6.忽略图案中的空格。
/d{2} ([W]) d{2} 1 d{2}/x相当于/d{2}([W])d{2}1d{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)f1/表示匹配的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
查找空白字符,与[ntrf]相同
s
查找多个空白字符,与[ntrf]相同
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编程中更得心应手。现在让作者介绍一下这些运算符和函数的用法: