2

我想匹配一个变量$x = 'AA12CB'。我正在使用正则表达式

$x =~ /\b[0-9]+\b/

我想断言我只有数字,但没有字母字符。此正则表达式不起作用。

4

4 回答 4

4

您需要在字符串的开头和结尾锚定模式以排除任何其他字符。这类似于您尝试使用\b边界的方法。阅读perlretut了解锚定的含义,它出现了几次。

use 5.010;
my $x = 'AA12CB';
if ($x =~ /\A [0-9]+ \z/msx) {
    say 'only digits'
} else {
    say 'not only digits'
}

也许您更愿意确定标量是否是数字/整数/整数/浮点数

于 2012-05-30T07:40:30.663 回答
2

我认为对于没有行尾的字符串,这个表达式最能捕捉到这个标准:

$x !~ /\D/

这意味着在任何时候都不$x匹配非数字字符。当然,如果您仍然想要 un chomp-ed 字符串的行尾,那么您必须使用负字符类,如下所示:

$x !~ /[^\d\n]/

$x与字符不是数字或换行符的字符串不匹配。

于 2012-05-30T11:37:13.867 回答
1

如果您只是在测试数字性之后,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'您的应用程序中不会遇到古怪...

于 2012-05-30T10:11:30.223 回答
1

这也应该在 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是这里的关键。它匹配任何不是数字的东西。您可以轻松地将其写为ifandelse而不是unlessand else

于 2012-05-30T09:23:46.910 回答