lit*_*tar 2 validation perl numbers
我知道有一个库可以做到这一点
使用Scalar :: Util qw(looks_like_number);
但我想用perl正则表达式来做.而且我希望它能用于双数而不仅仅是整数.
所以我想要比这更好的东西
$ var =〜/ ^ [+ - ]?\ d + $ /
谢谢.
Dav*_*idO 15
构造单个正则表达式来验证数字确实很困难.只有太多的标准需要考虑. Perlfaq4包含一节"如何确定标量是一个数字/整数/整数/浮点数?
该文档中的代码显示以下测试:
if (/\D/) {print "has nondigits\n" }
if (/^\d+$/) {print "is a whole number\n" }
if (/^-?\d+$/) {print "is an integer\n" }
if (/^[+-]?\d+$/) {print "is a +/- integer\n" }
if (/^-?\d+\.?\d*$/) {print "is a real number\n" }
if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) {print "is a decimal number\n"}
if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/) {
print "is a C float\n"
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您使用这些测试(不包括第一个测试),则必须验证一个或多个测试是否通过.然后你有一个号码.
另一种方法,因为您不想使用Scalar :: Util模块,您可以从代码IN Scalar :: Util中学习.Looks_like_number()函数设置如下:
sub looks_like_number {
local $_ = shift;
# checks from perlfaq4
return $] < 5.009002 unless defined;
return 1 if (/^[+-]?\d+$/); # is a +/- integer
return 1 if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/); # a C float
return 1 if ($] >= 5.008 and /^(Inf(inity)?|NaN)$/i)
or ($] >= 5.006001 and /^Inf$/i);
0;
}
Run Code Online (Sandbox Code Playgroud)
您应该能够使用适用于您的情况的该功能部分.
但是,我想指出,这Scalar::Util是一个核心Perl模块; 它与Perl一起提供,就像它一样strict.所有人的最佳做法可能只是使用它.
你应该使用Regexp :: Common,大多数模式比你意识到的更复杂.
use Regexp::Common;
my $real = 3.14159;
print "Real" if $real =~ /$RE{num}{real}/;
Run Code Online (Sandbox Code Playgroud)
但是,默认情况下不会锚定模式,因此更严格的版本是:
my $real_pat = $RE{num}{real};
my $real = 3.14159;
print "Real" if $real =~ /^$real_pat$/;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13755 次 |
| 最近记录: |