我想匹配一个变量$x = 'AA12CB'
。我正在使用正则表达式
$x =~ /\b[0-9]+\b/
我想断言我只有数字,但没有字母字符。此正则表达式不起作用。
您需要在字符串的开头和结尾锚定模式以排除任何其他字符。这类似于您尝试使用\b
边界的方法。阅读perlretut了解锚定的含义,它出现了几次。
use 5.010;
my $x = 'AA12CB';
if ($x =~ /\A [0-9]+ \z/msx) {
say 'only digits'
} else {
say 'not only digits'
}
也许您更愿意确定标量是否是数字/整数/整数/浮点数。
我认为对于没有行尾的字符串,这个表达式最能捕捉到这个标准:
$x !~ /\D/
这意味着在任何时候都不$x
匹配非数字字符。当然,如果您仍然想要 un chomp
-ed 字符串的行尾,那么您必须使用负字符类,如下所示:
$x !~ /[^\d\n]/
这$x
与字符不是数字或换行符的字符串不匹配。
如果您只是在测试数字性之后,Scalar::Util
'looks_like_number
函数应该就足够了:
use Scalar::Util 'looks_like_number';
print looks_like_number( $x )
? "$x is numeric\n"
: "$x is non-numeric\n";
我认为'0 but true'
您的应用程序中不会遇到古怪...
这也应该在 Perl 中工作。
$x = "AA12CB";
unless($x=~m/\D/) {
print("$x: Just digits\n");
}
else {
print("$x: Not just digits\n\n");
}
$x = "1223456";
unless($x=~m/\D/) {
print("$x: Just digits\n");
}
else {
print("$x: Not just digits\n");
}
\D
是这里的关键。它匹配任何不是数字的东西。您可以轻松地将其写为if
andelse
而不是unless
and else
。