第七章~第九章 正则表达式 1. 元字符 点(.)匹配除换行符的任意字符; 反斜线(\)用于转义 2. 量词 (*)零次或多次 (+)一次或者多次 (?)可有可无 a{2,4}匹配a字符2-4次 量词都为贪婪量词,即会尽可能多的匹配; 后面加上?则变为非贪婪量词 3. 模式分组 ()用来分组 \1 \2 引用分组 $_ = "yabba dabba"; if(/y(....) d\1/) {} 4. 择一匹配 或(|) /fred( +|\t+)barney/ 匹配单词中间有空格或制表符 5. 字符集 [abc] [a-zA-Z] [^\d] 6. 模式匹配 m//,m(),m[],m{}都行,用m//时可以简写为// 7. 可选修饰符 /i 大小写无关匹配 if(/yes/i){} /s 匹配任意字符,此时点(.)号可以匹配换行符 $_ = "barney\n with\nfred"; if(/barney.*fred/s){} /x 加入空白 /-?\d+\.?\d*/ #挤在一起 /-? \d+ \.? \d*/ #分开能看的清除些 /m 匹配多行 $text = "Fred dropped a 5 ton rock"; my @words = ($test =~ /([a-z]+)/ig); print "@words\n"; #"Fred dropped a ton rock" 8. 锚位 ^行首 $行尾 \d单词锚位 /\bname\b/ 匹配name,不匹配namespace 9. 匹配(=~) 不匹配(!~) 10. 模式串内插 $what = "name"; /^($what)/ <=> /^(name)/ 11. 捕获变量 $_ = "Hello there,neighbor"; if(/(\S+) (\S+) (\S+)/) {print "words are $1 $2 $3 \n";} 关闭捕获变量(?:),但是仍然占位$N if(/(?:Hello) (\S+)/) 给捕获变量命名(?<LABEL>PATTERN),访问时用$+{LABEL} if(/?<name1>\S+/) {say "$+{name1}";} 12. 自动匹配变量 $` : 匹配起始位置之前略过的串 $& : 匹配模式整个串 $' : 匹配结束位置之后的串 if("Hello there,neighbor" =~ /\s(\w+),/) { print "That was ($`)($&)($')\n"; } #输出结果为(Hello)( there,)( neighbor) 13. 优先级 圆括号 > 量词 > 锚位和序列 > 择一 > 元素 14. 替换与修饰符 s{__END__.*}{}s; # 删除掉__END__标记后的内容 $filename = s/^\s+|\s+$//g; # /g表示全局替换 /i /x /s和前述的意义相同 15. 大小写替换 \U 将其后的内容全部转换为大写 s/(fred|barney)/\U$1/gi; #FRED \L 将其后内容全部转换为小写 s/(Fred|Barney)/\L$1/gi; #fred \E 结束其后字符的大小写转换 s/(Fred)(Barney)/\U$1\E $2/gi; #FRED barney \u 将其后第一个字符转换为大写 s/(fred|barney)/\u\L$1/gi; #Fred \l 将其后第一个字符转换为小写 print "Hello,\L\u$name \n"; 16. split操作符可以使用正则表达式 @fields = split /:/,"::a:b:c::"; #得到("","","a","b","c"),会自动保留开头的空字段,去掉结尾的空字段 17. join函数连接字符串 my $str = join "-",@array ;