Perl正则,perl正则表达式匹配中文,PERL 正则表达式详细说明

Perl正则,perl正则表达式匹配中文,PERL 正则表达式详细说明perl正则表达式入门,适合喜欢学习PERL规则的朋友PERL中正则表达式的介绍一.导言匹配运算符III特殊字符1,2,[]和[] 3,*和?在模式4中转义字符5、匹配任意字母或数字6、锚模式7、模式中的变量替换8、字符范围转义前缀9、匹配任意字符10、匹配指定数量的字符11、指定选项12、模式的部分重用13、转义和特定字符的执行顺序14、指定模式分隔符15、模式顺序变量4、模式匹配选项1、匹配所有可能的模式(G选项)2忽略案例(I选项)例3将字符串视为多行(M选项)4仅执行一次变量替换例5将字符串视为单行忽略图案中的空格5更换操作员6翻译操作员7扩展模式匹配1不要将匹配内容存储在括号2中嵌入式模式选项3正反预测匹配4模式注释1.引入模式是指字符串中特定的字符序列,由反斜杠:/def/包含,即模式def其用法如下:结合split函数将一个字符串按照一定的模式分割成多个单词:@array=split(//,$ line);二、匹配运算符=~,~=~检查匹配是否成功:$ result=$ var=~/ABC/;如果在字符串中找到该模式,它将返回一个非零值,即true如果不匹配,则返回0,即false~事实正好相反这两个运算符适合条件控制,比如:if ($ question=~/please/) {print(谢谢你是波兰人! n’);} else { print(那不太礼貌! n’);}三模式中的特殊字符PERL支持模式中的一些特殊字符,可以起到一些特殊的作用1.字符表示一个或多个相同的字符,如:/def/指def、deef、deeeeef等它试图匹配尽可能多的相同字符例如,/ab/将匹配abb,而不是字符串abbc中的AB当一行中词与词之间有多个空格时,可以这样划分:@array=split (//,$ line);注意:split函数每次遇到拆分模式总会开始一个新词,所以如果$line以空格开头,那么@array的第一个元素就是空元素但是,它可以区分是否有真实的单词如果$line中只有空格,@array就是空数组上面示例中制表符被视为一个单词注意纠正2.字符[]和[] []表示匹配一组字符中的一个,如/a[0123456789]c/将匹配A+数字加c的字符串,结合例子:/d[eE] f/匹配def,dEf,deef,dEdf,dEEEeeeEef等表示除它之外的所有字符,如:/d [dee] f/a匹配d加非e字符加f. 3的字符串字符*和?它们类似于,除了*匹配0、1或更多相同的字符匹配0或1个字符比如/de*f/匹配df,def,deeeef等/de?F/匹配df或def4.转义字符如果要在模式中包含通常被视为特殊含义的字符,必须在它前面添加一个斜杠“”例如, * in/ */表示字符*而不是上面提到的一个或多个字符的意思斜杠表示为/ /在PERL5中,字符对Q和E可以用于转义5.匹配任何字母或数字上面提到的模式/a[0123456789]c/匹配字母A加任意数加C的字符串,另一种表示是:/a[0-9]c/同样,[a-z]代表任何小写字母,[A-Z]代表任何大写字母任意大小写字母和数字的表达式为:/[0-9a-zA-Z]/6.锚模式锚点或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 );} elsif($ varname=~ /^@[a-za-z][_0-9a-za-z]*$/){ print($ varname是合法的数组变量 n );} elsif($ varname=~ /^[a-za-z][_0-9a-za-z]*$/){ print($ varname是合法的文件变量 n );} else { print(我不明白$varname是什么 n’);}例3: 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.字符范围的转义e转义符描述范围d任何数字[0-9] D除数字[0-9]之外的任何字符 w任何单词字符[_0-9a-zA-Z] W任何非单词字符[_ 0-9a-za-z] s空白[ r t t示例:/[da-z]/匹配任何数字或小写字母9.匹配任何字符字符“.”匹配除换行符之外的所有字符,通常与*结合使用10.匹配指定数量的字符字符对{0}指定匹配字符的出现时间如:/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. 1之间匹配不超过3个e指定选项字符“|”,以指定两个或更多选项来匹配模式例如/def|ghi/matches def或ghi示例:检查数字的合法性,如果($number=~ /^ -?d $|^-?0[xX][ da-fa-F]$/){ print( $ number是合法整数 n’);} else { print($ number不是合法整数 n’);}哪里-?d $匹配十进制数字,-?0[xX][da-fa-F] $匹配十六进制数字12.模式的部分重用当一个模式中的同一个部分多次出现时,可以用括号括起来,并用n多次引用,以简化表达式:/ D { 2 }([ W]) D { 2 } 1 D { 2 }/match:12-05-92 26.11D { 2 })([ W]) 1 2 1/,后者只匹配17-17-17这样的字符串,而不匹配17-05-91等13.转义和特定字符的执行顺序与运算符相同转义和特定字符也有执行顺序:特殊字符描述()模式内存*?{}出现次数 b b Anchor |选项14.如果指定了默认的模式分隔符,则模式分隔符是反斜杠/,但也可以用字母M来指定,例如:M!/u/jqpublic/perl/prog1!相当于//u /jq public /perl /Prog 1/Note:当使用字母作为分隔符时,不进行变量替换;当使用特殊字符作为分隔符时,不能使用其转义函数或特殊函数15.模式匹配后,模式顺序变量可以作为变量$n用于调用重用部分的结果,作为变量$用于所有结果$string=该字符串包含数字25.11;$string=~ /-?(d )( d)/;#匹配结果为25.11 $ integer part=$ 1;#现在$ integer part=25 $ decimal part=$ 2;#现在$ decimalpart=11 $ totalpart=$#现在totalpart=25.11 IV模式匹配选项选项g匹配所有可能的模式I忽略大小写m将字符串视为多行o只赋值一次s将字符串视为单行x忽略模式中的空白1.匹配所有可能的模式(选项G) @matches=balata=~ /a/g;# now @matches=(ba , la , ta )匹配循环:while (balata=~/a/g){ $ match=$;print( $ match n );}结果是:ba la ta使用选项G时,下一次匹配的偏移量可以用函数pos来控制:$ offset=pos($ string);pos($ string)=$ new offset;2.忽略大小写(I选项)例/的/i匹配的是的,的,的,的,的3.将字符串视为多行(选项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}/。5.替换操作符的语法是s/pattern/replacement/,它的作用是用replacement替换字符串中与模式匹配的部分。比如:$ string= abc123def$ string=~ s/123/456/;# now $ string= abc456def模式顺序变量$n,如s/(d )/[$1]/,可用于替换部分,但模式的特殊字符,如{}、*等。替换零件中不支持。例如,s/abc/[def]/将用[def]替换abc。替换操作员的选项如下:选项g更改模式中的所有匹配项I忽略模式的大小写e将字符串替换为表达式m将待匹配的字符串视为多行o只赋值一次s将待匹配的字符串视为单行x忽略模式中的空格。注意:e选项将替换部分的字符串视为表达式,在替换前计算其值,例如:$ string= 0abc1$ string=~ s/[a-zA-Z]/$ x ^ 2/e;#现在$ string= 0 ABC 1 VI。翻译操作员。这是另一种替代方式,比如tr/string1/string2/。同样,string2也是替换部分,但它的作用是用string2中的第一个字符替换string1中的第一个字符,用string2中的第二个字符替换string1中的第二个字符,以此类推。如$ string= abcdefghicba$ string=~ tr/ABC/def/;# now string=defdefghifed 当string1比string2长时,其冗余字符被替换为string2的最后一个字符;当同一个字符在string1中出现多次时,将使用第一个替换字符。翻译运算符的选项如下:选项c翻译所有未指定的字符d删除所有指定的字符s并将多个相同的输出字符收缩为一个。如$ string=~ tr/ d//c;用空格替换所有非数字字符。$ string=~ tr/ t//d;删除制表符和空格;$ string=~ tr/0-9//cs;用空格替换数字之间的其他字符。七。扩展模式匹配PERL支持PERL4和标准UNIX模式匹配操作所不具备的一些模式匹配功能。它的语法是:(?模式),其中C是字符,模式是功能模式或子模式。1.不要将匹配的内容存储在括号中。在PERL的模式中,括号中的子模式将存储在内存中。这个函数取消括号中匹配内容的存储,比如/(?1 in: a|b|c)(d|e)f1/表示匹配的d或e,而不是a或b或c。嵌入式模式选项。通常,模式选项放在它的旁边。有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}(?#匹配两三个字母字符)/{.}

Perl正则,perl正则表达式匹配中文,PERL 正则表达式详细说明