它似乎工作得很好!
这里有一个提示:使用 Perl 变量$`
、$&
和$'
。这些变量是特殊的正则表达式变量,显示匹配前的字符串部分、匹配的内容和匹配后的字符串。
这是一个示例程序:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use Scalar::Util;
my @list = ("1", "2", "123");
foreach my $string (@list) {
if ($string =~ /\d{1,2}?/) {
say qq(We have a match for "string"!);
say qq("$`" "$&" "$'");
}
else {
say "No match makes David Sad";
}
}
输出将是:
We have a match for "1"!
"" "1" ""
We have a match for "2"!
"" "2" ""
We have a match for "123"!
"" "1" "23"
这样做是将字符串分成三个部分:正则表达式匹配之前的字符串部分、匹配正则表达式的字符串部分和正则表达式匹配之后的字符串部分。
在每种情况下,都没有预匹配,因为正则表达式从字符串的开头匹配。我们还看到\d{1,2}?
在每种情况下都匹配一个数字,即使123
可能匹配两个数字。为什么?因为匹配说明符末尾的问号告诉正则表达式不要贪婪。在这种情况下,我们告诉正则表达式匹配一个或两个字符。好吧,它匹配一个。去掉问号,最后一行应该是这样的:
We have a match for "123"!
"" "12" "3"
如果您想匹配一位或两位数,而不是三位或更多位,则必须指定一位或两位数之前和之后的字符串部分。像这样的东西:
/\D\d{1,2}\D/
这将匹配您的字符串foo12bar
,但不匹配foo123bar
。但是如果字符串是12
呢?在这种情况下,我们想说要么我们有字符串的开头,要么在我们的一个或两个字符匹配之前有一个非数字,我们要么在我们的结尾有一个非数字或字符串的结尾一两个字符匹配:
/(\D|^)\d{1,2}(/D|$)/
快速解释:
(\D|^)
:非数字或字符串的开头(^
锚点)
d{1,2}
: 一位或两位数
(\D|$)
:非数字或字符串的结尾($
锚点)
现在,这将匹配12
, 但不匹配 ,123
它会匹配foo12
and foo12bar
,但不匹配foo123
or foo123bar
。
只需寻找一位或两位数,我们可以简单地指定锚点:
/^\d{1,2}$/;
现在,它将匹配1
, 12
,但不匹配foo12
or 123
。
最主要的是使用$`
,$&
和$'
变量来帮助准确查看正则表达式匹配的内容以及匹配前后的内容。