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

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

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

$_ = "https://www.csdn.net";

if (m{https?://}i) {
}

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

$_ = "amazing.png";

if (m{\.png\z}i) {
}

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

# 这里第二个值由 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;
}

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

@_ = qw/bedRock fred Barney Wilma/;

foreach (@_) {
    # 匹配 首位置 不是小写字母 的字符串
    if (m/^[^a-z]/) {
        # 匹配 "Barney" 和 "Wilma"
        say "'$_' matched!";
    } else {
        # 不匹配 "bedRock" 和 "fred"
        say "Skipped '$_'.";
    }
}

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

$_ = "This ends in fred";

if (/fred$/) {
}

很多时候脱字符(^)和美元符($)的使用就和 \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!";
}

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

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

@_ = qw/selfishness fishery blowfish/;

foreach (@_) {
    if (/\bfish/) {
        # 匹配 "fishery"
    }
    if (/fish\b/) {
        # 匹配 "blowfish"
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值