• 正则表达式之锚位 (Perl 版)


    锚位含义
    \A匹配字符串的绝对开头
    \Z匹配字符串的绝对末尾
    \z匹配行尾(允许后面出现换行符)
    脱字符(^)Perl 4 开始:字符串开头锚位
    Perl 15 开始:行首锚位
    $Perl 4 开始:字符串结尾锚位
    Perl 15开始:行末锚位
    \b匹配单词首尾

    \A:匹配字符串的绝对开头,如果在开头处匹配不上,是不会顺移到下个位置进行尝试的。

    $_ = "https://www.csdn.net";
    
    if (m{https?://}i) {
    }
    
    • 1
    • 2
    • 3
    • 4

    \z:匹配字符串的绝对结尾,后面再无任何东西。如果要允许后面出现换行符,可以用 \Z

    $_ = "amazing.png";
    
    if (m{\.png\z}i) {
    }
    
    • 1
    • 2
    • 3
    • 4

    同时使用首尾锚位,可以确保模式能匹配给定字符串的全部,一个常见的例子是用来匹配空行:

    # 这里第二个值由 tab、换行符、空格组成,它是一个空行
    @_ = ("This is a wilma line",
          "
          ",
          "barney is on another line");
    
    my $linecnt = 1;
    
    foreach (@_) {
        printf "Is line_%d empty? %d\n", $linecnt, ((m/\A\s*\Z/) ? 1 : 0);
        $linecnt += 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    脱字符(^) 出现在字符集定义的开头时,表示对字符集的范围取反;出现在字符集之外时,某些时候就是元字符,表示字符串首锚位(如果只想匹配脱字符(^)本身,用反斜线进行转义即可)

    @_ = qw/bedRock fred Barney Wilma/;
    
    foreach (@_) {
        # 匹配 首位置 不是小写字母 的字符串
        if (m/^[^a-z]/) {
            # 匹配 "Barney" 和 "Wilma"
            say "'$_' matched!";
        } else {
            # 不匹配 "bedRock" 和 "fred"
            say "Skipped '$_'.";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    美元符($) 用于表示字符串结尾的锚位。

    $_ = "This ends in fred";
    
    if (/fred$/) {
    }
    
    • 1
    • 2
    • 3
    • 4

    很多时候脱字符(^)和美元符($)的使用就和 \A 和 \Z 一样,但是脱字符(^)和美元符($)配合修饰符 \m 使用还可以用于多行文本的匹配:

    $_ = "This is a wilma line
    barney is on another line
    but this ends in fred
    and a final dino line";
    
    if (/fred$/m) {
        say "It matched!";
    }
    
    if (/^barney/m) {
        say "It matched!";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这就告诉我们,修改历史代码需谨慎,书写的时候也是。。。

    单词锚位\b 匹配的是一组连续的 \w 字符的开头或结尾。
    \w 指的是可作为表示符的字符,因此它的范围并不仅仅只是严格意义上的单词,比如在 ASCII 语义下它指的是 [0-9a-zA-Z_] 这样一个范围,在 Unicode 语义下它的范围要大得多。

    @_ = qw/selfishness fishery blowfish/;
    
    foreach (@_) {
        if (/\bfish/) {
            # 匹配 "fishery"
        }
        if (/fish\b/) {
            # 匹配 "blowfish"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    iOS学习 --- Xcode 15 下载iOS_17.0.1_Simulator失败解决方法
    QT中QByteArray与char、int、float之间的互相转化
    【雷达原理】雷达测距原理及实现方法
    基于深度学习的图书管理推荐系统(python版)
    Postgresql事务测试
    【微服务部署】九、使用Docker Compose搭建高可用双机热备MySQL数据库
    无人机反制软硬手段
    NodeJS http请求
    STM32 HAL库 串口使用问题记录
    redis性能优化及哨兵模式
  • 原文地址:https://blog.csdn.net/wenrui7868/article/details/127869275