可以用操作符“=~”和“=!”来进行模式匹配:
- $string = 'abcdef';
- print $string =~ "bcd" . "\n"; # 1 即true
- print $string =! "bcd" . "\n"; # null 即false
上面的例子中=~表示$string包含了bcd,=!表示$string不包含bcd。
模式匹配的标准形式是用斜杠来表示的:
最前面的m表示匹配(match)。两斜杠中间的字符串是用来匹配的内容。在最后的斜杠的右侧可以加入匹配选项,比如g表示匹配多个:
- @matches = 'abcdefbcdgh' =~ m/bcd/g
利用g选项,可以让匹配返回一个数组。上例的@matches有两项,值都为"bcd"。前面的m可以省略,而最后的选项也是可选的,所以最简单的匹配方式就是:
匹配的内容可以是正则表达式:
- sub printMatches {
- foreach $s (@_)
- {
- print "||" . $s . "|| ";
- }
- print "\n";
- }
- # 字符+表示前面的字符出现一次或多次
- printMatches 'babaaba' =~ /a+b/g; # ||ab|| ||aab||
- # 字符*表示前面的字符出现零次、一次或多次
- printMatches 'babaaba' =~ /a*b/g; # ||b|| ||ab|| ||aab||
- # 字符?表示前面的字符出现零次或一次
- printMatches 'babaaba' =~ /a?b/g; # ||b|| ||ab|| ||ab||
- # 利用反斜杠表示转义
- printMatches '*+?' =~ /\*\+\?/g; # ||*+?||
- # 字符[]表示一组字符中的某一个
- printMatches 'abacadae' =~ /a[cd]/g; # ||ac|| ||ad||
- # 字符[^]表示不匹配一组字符中的任一个
- printMatches 'abacadae' =~ /a[^cd]/g; # ||ab|| ||ae||
- # 匹配字母或数字
- printMatches 'iC79@' =~ /[a-z|A-Z][0-9]/g; # ||x9|| ||C7||
- # 字符^或\A匹配串首
- printMatches 'abc9abd' =~ /^ab[a-z]/g; # ||abc||
- # 字符$或\Z匹配串尾
- printMatches 'abc9abd' =~ /ab[a-z]$/g; # ||abd||
- # 字符\b表示单词边界
- printMatches 'aw1 w2 w3a' =~ /\bw[1-9]/g; # ||w2|| ||w3||
- printMatches 'aw1 w2 w3a' =~ /w[1-9]\b/g; # ||w1|| ||w2||
- # 字符\B表示单词内部,即非单词边界
- printMatches 'aw1 w2 w3a' =~ /\Bw[1-9]/g; # ||w1||
- printMatches 'aw1 w2 w3a' =~ /w[1-9]\B/g; # ||w3||
- # \d表示任意数字
- printMatches 'w@aw1wgw3' =~ /w\d/g; # ||w1|| ||w3||
- # \D表示非数字
- printMatches 'w@aw1wgw3' =~ /w\D/g; # ||w@|| ||wg||
- # \w表示任意单词字符,即字母与数字
- printMatches '#ab#d@#89#!' =~ /#\w+/g; # ||#ab|| ||#d|| ||#89||
- # \W表示非单词字符
- printMatches '#ab#d@#89#!' =~ /#\W+/g; # ||#!||
- # \s表示空白字符
- printMatches 'a bc def ghij' =~ /\w+\s/g; # ||a || ||bc || ||def ||
- # \S表示非空白字符
- printMatches 'a bc def ghij' =~ /\w+\S/g; # ||bc|| ||def|| ||ghij||
- # .表示除换行外的任意字符
- printMatches 'a@a2ab' =~ /a./g; # ||a@|| ||a2|| ||ab||
- # {}用于指定匹配字符出现的次数
- printMatches 'ababbabbbabbbb' =~ /ab{2,3}/g; # ||abb|| ||abbb|| ||abbb||
- printMatches 'ababbabbbabbbb' =~ /ab{1}[^b]/g; # ||aba||
- printMatches 'ababbabbbabbbb' =~ /ab{3,}/g; # ||abbb|| ||abbbb||
- # |用来匹配多种模式
- printMatches 'isa82@32&64' =~ /[a-z]+\d+|@\d+/g; # ||isa82|| ||@32||
特殊字符也有优先级(由上至下优先级由高到低):
特殊字符
|
描述
|
()
|
模式内存
|
+ * ? {}
|
出现次数
|
^ $ \b \B
|
锚
|
|
|
选项
|
- # 可以用任意字符来作为模式定界符来代替默认的/
- printMatches 'ab///c/d' =~ m#[a-z]/+#g; # ||b///|| ||c/||
圆括号可以把部分组合成整体:
- # 用()可以将不同的部分组合起来,作为整体进行重复匹配
- printMatches 'ab#abab#ababab#aba' =~ /(ab){3}/g; # ||ab|| (返回的值为圆括号最后一次匹配的字符串)
- print $&; # ababab ($&用来存储最后一次匹配的结果)
- printMatches 'aabbabab' =~ /(ab){3}/g; # null
- # $1,$2,...用来存放各个组(即圆括号)最后一次匹配的结果
- printMatches 'a1=b2#c3-d4 e5=f6#g7-h8' =~ /(\w+)=(\w+)#(\w+)-(\w+)/g; # ||a1|| ||b2|| ||c3|| ||d4|| ||e5|| ||f6|| ||g7|| ||h8||
- print "$1, $2, $3, $4, $5, $6, $7, $8\n"; # e5, f6, g7, h8, , , , (字符串中有两个匹配,最后一次匹配到的串是e5=f6#g7-h8,所以$1其实是最后匹配到的串中的第一个组)
最后斜杠后面的模式选项:
- # g选项匹配所有可能的模式
- @matches = "aa.bb.cc" =~ /\w+/g; # aa, bb, cc
- print "@matches\n";
- while ("ab,abab,ababab" =~ /(ab)+/g)
- {
- print "$&\n";
- }
- # g选项下可以用pos来返回或设置字符串的匹配位置
- $string = "a1a2a3a4";
- $index = pos($string); # null
- $string =~ /a\d/g; # a1
- $index = pos $string; # 2 匹配了a1这两个字符
- $string =~ /a\d/g; # a2
- pos($string) = 6;
- $string =~ /a\d/g; # a4 略过了中间的a3
- # i选项忽略大小写
- printMatches 'A2a3' =~ /a\d/g; # ||a3||
- printMatches 'A2a3' =~ /a\d/ig; # ||A2|| ||a3||
- # m选项将字符串看作多行
- printMatches "first line\nseconde line" =~ /.*line$/g; # ||seconde line||
- printMatches "first line\nseconde line" =~ /.*line$/gm; # ||first line|| ||seconde line||
- # s选项把字符串看作单行,使得.可以匹配\n。
- printMatches "first line\nsecond line" =~ /.*line$/g; # ||seconde line||
- printMatches "first line\nsecond line" =~ /.*line$/gs; # ||first line(换行)second line||
- # o选项只赋值一次
- $var = "a";
- for ($i = 1; $i <= 3; $i++)
- {
- printMatches "ab" =~ /$var/go; # a, a, a
- $var = "b";
- }
- $var = "a";
- for ($i = 1; $i <= 3; $i++)
- {
- printMatches "ab" =~ /$var/g; # a, b, b
- $var = "b";
- }
- # x忽略模式中的空白
- printMatches "a b c def" =~ /\w \w \w/g; # ||a b c||
- printMatches "a b c def" =~ /\w \w \w/gx; # ||def||
替换操作符:和匹配的形式类似,语法为s/pattern/replacement/:
- $string = '@#a&^b09-+cd=[';
- $num = $string =~ s/\W/\*/g; # $num = 8(替换了8处),$string = **a**b09**cd**
替换操作符的模式选项和匹配的模式选项基本一样(g,i,m,s,o,x,),但多一个选项e,表示把替换部分看作表达式:
- $string = 'a1a2a3';
- $string =~ s/\d/{1}*2/ge; # a2a4a6
- $string =~ s/\d/{1}*2/g; # a2*2a4*2a6*2
翻译操作符:语法为tr/string1/string2/,将string1里的字符一一替换为string2中相应位置的字符:
- $string = "abcdegcba";
- $string =~ tr/abc/xyz/; # xyzdegzyx 相应的字符会替换为第二个字符串中相应的字符
- $string = "abcdegcba";
- $string =~ tr/abc/xy/; # xyydegyyx 多出来的c,替换为最末尾的y
- $string = "abcdegcba";
- $string =~ tr/abc/xyzw/; # xyzdegzyx 最后一个w被忽略
- $string = "abcdegcba";
- $string =~ tr/aba/xyz/; # xycdegcyx 第一个a被替换,第二个a被忽略
- $string = "aabc+degcba";
- $string =~ tr/a+/xy/; # xxbcydegcbx 翻译操作符不支持正则表达式,+号被替换为y
翻译操作符支持三种模式选项:
- # c选项翻译所有未指定的字符
- $string = "a32()64aca";
- $string =~ tr/0-9/*/c; # *32**64***
- # d选项删除所有指定字符
- $string = "a32()64aca";
- $string =~ tr/0-9/*/d; # a()aca
- # s选项把非指定的字符缩成一个字符
- $string = "a32()64aca";
- $string =~ tr/0-9/*/s; # a*()*aca
扩展模式匹配的语法为(?
pattern),其中c为一个字符。它有以下用法:
表示不存贮圆括号的内容:
- # ?:表示不存贮括号内的匹配内容
- printMatches "abcdef" =~ /(abc)(def)/; # ||abc|| ||def||
- 表示内嵌模式选项,可以是i,m,s,x:
- # 内嵌模式选项i
- printMatches "aA bB" =~ /(?i)aa|bb/g; # ||aA|| ||bB||
- printMatches "aA bB" =~ /aa|(?i)bb/g; # ||bB||
- printMatches "aA bB" =~ /aa|bb/gi; # ||aA|| ||bB||
- # 内嵌模式选项m
- printMatches "line1\nline2\n" =~ /(?m)line\d$/g; # ||line1|| ||line2||
- # 内嵌模式选项s
- printMatches "line1\nline2\n" =~ /(?s).*line\d$/g; # ||line1 换行 line2||
- # 内嵌模式选项x
- printMatches "abc,def" =~ /(?x)a b c/g; # ||abc||
表示预见匹配:
- # 肯定预见匹配
- printMatches "1a2b3c" =~ /\d(?=b)/g; # ||2|| 下一位的b只被预览,而没有被匹配
- # 否定预见匹配
- printMatches "1a2b3c" =~ /\d(?!b)/g; # ||1|| ||3||
表注释:
- # ?#表注释
- printMatches "hello" =~ /he(?#注释)/g; # ||he||
阅读(1167) | 评论(0) | 转发(0) |