【问题标题】:How to extract a number from a string in Perl?如何从 Perl 中的字符串中提取数字?
【发布时间】:2010-08-26 12:10:44
【问题描述】:

我有

print $str;
abcd*%1234$sdfsd..#d

字符串总是只有一个连续的数字,例如 1234 在这种情况下。其余都是字母或其他特殊字符。

如何提取号码(在本例中为1234)并将其存储回str

This page 建议我应该使用\d,但是如何使用?

【问题讨论】:

    标签: perl


    【解决方案1】:

    如果您不想修改原始字符串,您可以通过使用子模式在正则表达式中捕获数字来提取数字。在列表上下文中,正则表达式返回子模式中定义的匹配项。

    my $str = 'abc 123 x456xy 789foo';
    
    my ($first_num) = $str =~ /(\d+)/;   # 123
    my @all_nums    = $str =~ /(\d+)/g;  # (123, 456, 789)
    

    【讨论】:

    • +1。与我的答案相比,这有一个优势,即它不假设字符串中只有一个嵌入数字。
    【解决方案2】:
    $str =~ s/\D//g;
    

    这会从字符串中删除所有非数字字符。这就是你需要做的所有事情。

    编辑:如果其他脚本中可能存在 Unicode 数字,更好的解决方案是:

    $str =~ s/[^0-9]//g;
    

    【讨论】:

    • Lazer 要求的是一个数字,而不仅仅是一个整数。此正则表达式将删除 .e,它们可用于形成浮点数。由于 Perl 中的 Unicode 支持,\d 不仅仅是[0-9]:其他字形(如印度)中的数字是有效的。所以你的正则表达式也将接受不是数字的字符串。
    • @dolmen Lazer 应该更具体。他的例子不包括小数或指数,我不能确定他是否想包括它们。不过,您对 unicode 变体脚本数字是正确的,我会编辑。
    【解决方案3】:

    如果您想以破坏性的方式进行操作,这是最快的方法。

    $str =~ tr/0-9//cd;
    

    translate 将0-9complement 中的所有字符删除,d删除它们。

    这种方法和 Phillip Potter 的一个警告是,如果在字符串后面还有另一组数字,它们将与第一组数字连接。所以不清楚你是否想要这样做。

    获得一组且只有一组数字的可靠方法是

    ( $str ) = $str =~ /(\d+)/;
    

    匹配,在列表上下文中返回捕获列表。 $str 周围的括号只是将表达式放在列表上下文中并将第一个捕获分配给 $str

    【讨论】:

      【解决方案4】:

      就我个人而言,我会这样做:

      $s =~ /([0-9]+)/; 
      print $1;
      

      $1 将包含与给定正则表达式匹配的第一组(圆括号中的部分)。

      【讨论】:

      • 切勿使用$1$2 等中的值,除非您首先确认匹配成功。捕获变量仅在成功匹配时(重新)设置,如果您的示例中的 $s 没有任何数字,您将获得上次匹配的结果。
      • 哇,我真傻。感谢您的解释。只是为了确保我吸取教训...if($s =~ /([0-9]+)/) print $1 是使用分组变量的正确方法吗?
      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      相关资源
      最近更新 更多