锚位 | 含义 |
---|---|
\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"}
}
上一篇:【问卷调查发布系统的设计与实现】
下一篇:子串和子序列问题-动态规划向