代码之家  ›  专栏  ›  技术社区  ›  user2052436

Perl Regex提取浮点数

  •  2
  • user2052436  · 技术社区  · 6 年前

    我需要修改某人的Perl脚本,我对Perl一点也不熟悉。

    有一个标量变量 $var ,其值为浮点数,后面可能是垃圾邮件。我需要提取浮点数。

    数字采用非指数格式:ddd[.ddd],没有符号。

    可能缺少小数部分。不缺少整数部分( .123 只是垃圾)

    如果变量以垃圾(特别是符号或小数点)开头,我需要提取空字符串。

    示例:

    -123.456 ==> ""
    123. ==> "123"
    123.456.789 ==> "123.456"
    123.456junk ==> "123.456"
    123junk ==> "123"
    123.junk ==> "123"     # strip the dot if no fraction
    .123 ==> ""
    junk ==> ""
    000.000 ==> "000.000"
    

    有人能提供解决方案吗?我想应该是: $var =~ s/REGEX_EXPRESSION 但是我不知道 REGEX_EXPRESSION 应该是。

    谢谢您。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Paolo    6 年前

    更新后,需要的表达式是:

    ^\d+(?:\.\d+)?
    
    • ^\d+ 匹配字符串开头的数字。
    • (?: 非捕获组的开始。
    • \.\d+ 匹配文本 . ,后跟数字。
    • )? 关闭非捕获组,使其成为可选的。

    检查表达式 here

    Perl示例:

    $var = "123.456.789";
    print "old $var\n";
    $var =~ /(^\d+(?:\.\d+)?)/;
    print "new $1\n";
    

    印刷品:

    old 123.456.789
    new 123.456
    
        2
  •  0
  •   user2052436    6 年前

    所以我尝试使用建议的表达式,我想我在Perl中没有正确地使用它们:

    my $var = "123.456.66";
    print "old $var\n";
    $var =~ s/^\d+(?:\.\d+)?//;
    print "new $var\n";
    

    输出:

    $perl main.pl
    old 123.456.66
    new .66
    
        3
  •  -1
  •   Schwern    6 年前

    据我所知,您需要从字符串中提取前一组或两组数字。就像这样。

    123.456.789  # 123.456
    123.456abc   # 123.456
    123abc       # 123
    abc123       # nothing
    

    regex看起来像这样,为了更好的解释而展开。

    qr{
      (
        \d+ 
        (?: \.\d+ )?
      )
    }x;
    

    qr 是regex引用运算符。使用 x 意思是忽略空格,使事物更具可读性。

    \d 匹配数字。 + 表示与前面的一个或多个匹配。所以 \d+ 是一个或多个数字。

    () 捕获内容。

    (?:) 对内容进行分组,但不捕获。

    ? 表示捕获前面的0或1。这意味着它是可选的。

    所以 (?: \.\d+ )? 表示点后接一些数字是可选的。

    你会这样用的。

    my $str = "123.456abc";
    my $digits_re = qr{ (\d+ (?: \.\d+ )?) }x;
    my($digits) = $str =~ $digits_re;
    print $digits;
    

    有关更多信息,请参阅 Perl Regex Tutorial 你可以在上面玩 Regex 101 .