【问题标题】:\d+ regexp ignores minus at the beginning\d+ 正则表达式忽略开头的减号
【发布时间】:2014-03-01 15:26:45
【问题描述】:

我遇到了 Perl 的行为,我无法解释:

#!/usr/bin/perl

use strict;
use warnings;

my $number = -10;
if ($number =~ /\d+/) {
    print $number;
}

这会打印出-10,尽管事实上,

  • \d代表[0-9]

为什么一开始就忽略减号?

【问题讨论】:

  • \d 并不总是与[0-9] 相同,请参阅stackoverflow.com/q/890686/372239
  • @M42 那么,\d 还可以匹配 Unicode 表中的希伯来语、亚美尼亚语和其他非标准数字?
  • @M42 哪个 perl 版本开始使用 /a 修饰符?
  • @mpapec:我认为是 5.14
  • /\d+/ 仅表示“字符串是否包含一个或多个数字的序列?”您的字符串包含两位数字,因此匹配。您期待什么替代行为?

标签: regex perl


【解决方案1】:

您也应该使用 ^: 匹配字符串的开头:

if ($number =~ /^\d+/) {

【讨论】:

  • 是的,当然。要匹配整个字符串,我应该使用 ^\d+$
【解决方案2】:

减号是符号,不是数字,所以使用:

if ($number =~ /^-?\d+$/) {
    print $number;
}

-? 表示减号- 符号可以遇到一次或零次

【讨论】:

  • 也许最好使用捕获组并打印$1,否则这将是我的首选答案:)
  • 你的意思是/^-?(\d+)$/?你想在哪里使用$1
  • 不喜欢 /^(-?\d+)/ 并使用 $1 来查看匹配的内容,但无论如何。
  • 好的,我添加了捕获组 :) 但在if 声明中我认为没有必要
  • 在这种情况下不需要使用捕获组。它会减慢脚本的速度。
【解决方案3】:

你可以这样写

if ($number and $number !~ /\D/) {
  print $number;
}

它检查字符串不是零长度并且不包含任何非数字字符。

【讨论】:

    【解决方案4】:

    无论 \d+ 或 [0-9]+ 的目的是什么,它只做正确的事情。这取决于您的要求,您还想要什么,例如整数的混合,或者只是负数来匹配或正数来匹配或开始、结束、任何地方等。一切都取决于您想要开发的模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2019-02-08
      • 2018-01-21
      相关资源
      最近更新 更多