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

缺乏、安全感 2022-01-29 17:53 603阅读 0赞

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

1. 正则匹配语法

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

1.1 简写方式

  • 简写模式使用内置变量$_与模式进行匹配.
  • 标准模式无须使用绑定操作符 =~

    匹配字符串

    $_ = “hello,world”;
    if(/ll/){
    print “it matched!\n”;
    }

  1. # 匹配数组
  2. @books=("java", "javascript", "linux", "unix");
  3. foreach (@books){
  4. print "$_ matched!\n" if(/java/);
  5. }

1.2 标准方式

  • 标准模式需要使用绑定操作符 =~

    foreach my $book (@books){
    if($book =~ /i.*x/){

    1. 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://}) {

    1. print "$web\n";

    }
    }

2. 正则模式中的元字符

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


































































元字符 含义 实例
. 匹配任意字符 a.b, 可匹配aab, abb, 不匹配ab, accb
标识前面字符出现0~n次 abd, 可匹配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, aB
s 默认元字符.无法匹配换行符\n, 添加s修饰后可匹配换行符 /a.b/s,可匹配aab, a\nb
x 允许模式中添加空白符 可在模式中任何位置添加任意多个空白符,增加模式的可读性. 但是需要注意的是,匹配空白符需要使用\s
a 使用ASCII 匹配
u 使用Unicode 匹配

4. 锚位

  • 默认情况下, 如果字符串的开头不匹配给定的模式, 那么会瞬移至第二个字符尝试, 直到字符串的最后一字符。
  • 通过锚位,我们可以指定字符串从哪儿开始匹配.
  • perl5 对于行首和行位有了新的表示方式, 但是常用的还是 ^和$

































锚点符号 含义
^ 匹配行首, perl4 表示方式
$ 匹配行尾, perl4 表示方式
\A 字符串绝对开头, perl5 新方式
\a 行首, perl5 新方式
\Z 字符串绝对末尾, perl5 新方式
\z 行尾部, perl5 新方式
  1. $str = 'hello world
  2. hi world
  3. welcome world';
  4. # 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 条评论,603人围观)

还没有评论,来说两句吧...

相关阅读

    相关 表达式匹配

    请实现一个函数用来匹配包括`'.'`和`' '`的正则表达式。模式中的字符`' .'` 表示任意一个字符,而`' '`表示它前面的字符可以出现任意次(包含0次)。 在本题中

    相关 表达式匹配

    写在前面 > 剑指offer:正则表达式匹配 题目要求 > 请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前

    相关 perl表达式

    默认匹配$\_ (.) 通配符:匹配任何单个的字符,但不包括换行符"\\n"; (\) 匹配前一项0次或者多次; (+) 匹配前一项一个或者多个; (?) 匹配前一项0