锚位 | 含义 |
---|---|
\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"
}
}