14. Perl 正则表达式-正则匹配

    xiaoxiao2022-07-04  208

    正则表达式(regular expression) 在Perl 里面通常也叫模式(Pattern). 正则表达式是用来匹配或不匹配某个字符串是否符合特定字符串模板的,也可以实现字符串的替换.

    1. 正则匹配语法

    Perl 的正则表达式语法非常灵活, 可以借助于内置变量$_ 进行简化, 也可以借助于m符号来自定义匹配定界符.

    1.1 简写方式

    简写模式使用内置变量$_与模式进行匹配.标准模式无须使用绑定操作符 =~ # 匹配字符串 $_ = "hello,world"; if(/ll/){ print "it matched!\n"; } # 匹配数组 @books=("java", "javascript", "linux", "unix"); foreach (@books){ print "$_ matched!\n" if(/java/); }

    1.2 标准方式

    标准模式需要使用绑定操作符 =~ foreach my $book (@books){ if($book =~ /i.*x/){ print "$book matched!\n"; } }

    1.3自定义模式定界符

    当匹配模式中包含多个/ 时, 由不想借助转移字符\时, 可以使用自定义模式定界符自定义定界符时, 需要使用m常用的模式定界符有大括号{} # 简写模式 $_="https://baidu.com"; print "$_ matched!\n" if(m{https://}); # 标准模式 @webs=("https://baidu.com", "https://taobao.com", "http://jd.com", "http://tianmao.com"); foreach my $web (@webs){ if($web =~ m{https://}) { print "$web\n"; } }

    2. 正则模式中的元字符

    所谓元字符,就是指在正则表达式中具有特殊含义的字符。当元字符想表示其本身时, 需要借助于反义字符.

    元字符含义实例.匹配任意字符a.b, 可匹配aab, abb, 不匹配ab, accb*标识前面字符出现0~n次ab*d, 可匹配ad, abd, abbd, 不可匹配aed+标识签名字符出现1~n次ab+d, 可匹配abc, abbd, 但不可匹配ad, aed()模式分组, 可对模式进行组合多次匹配a(bc)+d, 可匹配abcd, abcbcd 等|表示或, 笔者通常会与() 组合使用a(b[]匹配[]中的任一一个字符a[bce]d, 只可匹配abd, acd, aed[] 中的-与[] 配合使用, 属于[]对连续字符的简写模式a[1-3]b, 只匹配a1b, a2b, a3b[] 中的^表示[]匹配的反义, 即不匹配[]中的任意字符[^0-9], 匹配非数字\反义字符,取消元字符的反义a\.b, 匹配a.b\n引用捕获组, n 为数字1, 2, 3…([a-d])([0-9]-\2\1, 匹配a0-0a, b2-2b 等\g{n}引用捕获组, n为数字, 可为负数 …,-2,-1,0,1,2…(a-d)(0-9)-\g{-1}\g{1}, 匹配a0-0a, b2-2b 等

    3. 模式修饰符

    模式修饰符可以组合,不分先后.

    修饰符含义示例i忽略大小写/ab/s, 可匹配ab,AB, Ab, aBs默认元字符.无法匹配换行符\n, 添加s修饰后可匹配换行符/a.b/s,可匹配aab, a\nbx允许模式中添加空白符可在模式中任何位置添加任意多个空白符,增加模式的可读性. 但是需要注意的是,匹配空白符需要使用\sa使用ASCII 匹配u使用Unicode 匹配

    4. 锚位

    默认情况下, 如果字符串的开头不匹配给定的模式, 那么会瞬移至第二个字符尝试, 直到字符串的最后一字符。通过锚位,我们可以指定字符串从哪儿开始匹配.perl5 对于行首和行位有了新的表示方式, 但是常用的还是 ^和$ 锚点符号含义^匹配行首, perl4 表示方式$匹配行尾, perl4 表示方式\A字符串绝对开头, perl5 新方式\a行首, perl5 新方式\Z字符串绝对末尾, perl5 新方式\z行尾部, perl5 新方式 $str = 'hello world hi world welcome world'; # hello 为字符串绝对开头, hi 为行首.

    5. 字符集简写

    对于出现批量比较高的正则表达式分组, Perl 提供了简写模式. 但是使用简写模式时需要注意使用的编码模式时ASCII 码还是Unicode 编码.

    锚点符号含义\s匹配任意空白符,可匹配空格符,换行符,水平制表符, 换页符, 回车符\d匹配数字0-9\w匹配任意单个字符, ASCII码方式匹配[a-zA-Z0-9_], Unicode模式可匹配更多\R匹配断行符, 匹配\r\n 或 \n\W反义简写, 等价于 [^\w]\D反义简写, 等价于 [^\d]\S反义简写, 等价于 [^\s]

    6. 返回值

    对于正则匹配, 判断结果只有两种,要么是匹配,要么是不匹配.

    返回空: 不匹配返回1: 匹配 $str="hello,wolrd"; $has_x = $str =~ /x/; $has_o = $str =~ /o/; # 输出结果: has_x:, has_o:1 print "has_x:$has_x, has_o:$has_o\n";
    最新回复(0)