perl: 正则表达式
正则表达式: 正则表达式在perl叫模式,是一个匹配某字符串的模板。 perl的正则表达式和shell/awk/sed/grep的差不多。 ? m/pattern/?????? 运算模式匹配: /pattern/就是m/pattern/的简写, 定界符//可以换成别的符号([{<#$%等等, 如果用//开头的m可以省略,其他符号m不能省略。 定界符应该选择模式中不会出现的字符。 ? Perl中的正则表达式的修饰符: /pattern/i???? 用i来匹配不用区分大小写。 /pattern/s???? 用s来匹配任意字符。 /pattern/x??? 用x来表示可以在模式中随意加上空白: Pattern中的空白都回被忽略,可以用s来匹配空白。 Perl中的注释也是空白。 ? if?? (m{ ??? Pattern1???#comment1 ??? Pattern2???#comment2 }six) { ??? … } ? Perl的反向引用: n 表示对哪个分组的引用,分组数为//中的左括号的位置。 /(.)1/??? 表示匹配连续出现的两个同样的字符,1是对第一组的引用。 /x(...)y1/?? 表示x之后的三个字符在y之后再出现一次,也就是x...y... /x(.)(.)21/?? 分别对第一组和第二组的引用,2表示对第二个分组的引用。 /x((.)(.)32)y1/?? 用到了三个分组。 ? 新版perl可以使用反向引用: g{N}?? 用N表示哪个分组。 ? 默认的匹配对象是$_。 “string” =~?? /pattern/???#使用=~绑定操作符指定匹配的对象。 $res = <STDIN> =~/pattern/;??? #如果匹配到$res=1,否则为空 ? 捕获变量: $n 用来表示 /pattern/ 中从左到右第n个括号中的内容。 $n这些捕获变量只有在下次匹配成功时才会被重置。 (?:pattern)使用?:表示这个括号不捕获,只是分组,$n不计数。 if ($str =~ /pattern/) { ??? my $match = $1;??? #将捕获的字符串保存起来以便以后使用。 } else { ??? …?????????#如果匹配失败,$n保存的还是上次的值。 } ? 新版perl可以使用命名捕捉: 加标签的方法?? /(?<LABEL>PATTERN) / 捕捉的结果进入特殊哈希%+ 键:标签 , 值:就是捕捉的字符串。 LABEL自己命名,访问的值为$+{LABEL} 新版的反向引用还可以用: g{LABEL} 等效于 k<LABEL> ? 自动匹配变量: $& 用来存放/pattern/里实际匹配到的部分。 $` 用来存放匹配起始位置之前的字符串。 $'?? 保存了字符串中从来没有被匹配到的部分。 ? while (<>) { ??? chomp; ??? if (/YOUR_PATTERN_GOES_HERE/) { ??????? print “Matched:|$`<$&>$'|n”; ??? } else { ??????? print “No match: |$_|n”; ??? } } ? s/pattern1/pattern2/?? 运算替换操作: s/pattern1/pattern2/;???????? #用pattern2替换掉pattern1匹配到的内容。 s///?? 替换成功返回真,否则返回假。 s操作的的定界符也可以是任意字符。 s#pattern1#pattern2#; s{pattern1}{pattern2}; s[pattern1]<pattern2>; ? s替换操作的修饰符: s/pattern1/pattern2/g;??? #g表示全局替换。 s/^s/+|s+&//g;??? #去掉开头和结尾的空白。 i??? 表示不去分大小写 s??? 表示匹配任意字符。 m?? 可以匹配行内的换行符 ? s操作的默认字符串也是$_,还可以绑定操作符: $filename =~ s#^.*/##s;??? #去掉路径获取文件名 ? 大小写转换: 下面操作适用于双引号内的字符串。 s/pattern1/Upattern2/;??? #将pattern2转换成大写。 s/pattern1/Lpattern2/;??? #将pattern2转换成小写。 s/pattern1/Upattern2Epattern3/;??? #只将pattern2转换成大写。 s/pattern1/Lpattern2Epattern3/;??? #只将pattern2转换成小写。 s/pattern1/upattern2/;??? #将pattern2的第一个字符大写。 s/pattern1/lpattern2/;??? #将pattern2的第一个字符小写。 ? 贪婪量词: 尽可能匹配更多 * + ? {n} {n,} {n,m} ? 非贪婪量词: 尽可能匹配更少 *? +? ?? {n}? {n,}? {n,m}? ? 一次更新多个文件: $^I?? ?表示备份文件的扩展名。 ? 在命令行进行编辑: perl?? -p??-i.bak?? -w?? -e??'s/pattern1/pattern2/g'??fred*.dat 将所有fred*.dat文件中的pattern1全部改成pattern2,备份文件为*.bak. ? ~~? 智能匹配: use??? 5.010; 智能匹配优先级: %a ~~ %b %a ~~ @b %a ~~ /Fred/ %a ~~ ‘Fred’ @a ~~ @b @a ~~ /Fred/ @a ~~ 123 @a ~~ ‘Fred’ $name ~~ undef $name ~~ /Fred/ 123 ~~ ‘123.0’ ‘Fred’ ~~ ‘Fred’ 123 ~~ 456 ? 自动在hash中匹配键: say “I found a key matching‘Fred’.n” ??? if??%name?? ~~?? /Fred/; ? 比较两个数组大小: say “The array have the sameelements!n” ??? if???@arr1??? ~~??? @arr2; ? 判断结果是否在集合中: say “Ths $result is one ofthe input values @nums!n” ??? if @nums??~~? ?$result; ? split?? /PATTERN/[,EXPR,LIMIT]]: 将模式作为分隔符拆分字符串到列表中,返回列表或列表长度, split会保留开头的空白,忽略结尾的空白, split默认用空白分割$_. my@arr = split;?? # ==?? split /s+/,$_; ? join??? EXPR,LIST: 将字符串expr作为分隔符插入到列表中组成一个新的字符串并返回。 ? pos quotemeta study qr//? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |