Perl正则表达式提取浮点数

问题描述 投票:2回答:3

我需要修改某人的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应该是什么。

谢谢。

regex perl
3个回答
2
投票

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

^\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

0
投票

所以我正在尝试建议的表达式,我想我没有在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

-1
投票

据我了解,您需要从字符串中提取前一个或两个数字组。像这样。

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

正则表达式看起来像这样,扩展出来以获得更好的解释。

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

qr是正则表达式引用运算符。使用x意味着忽略空格,因此事物更具可读性。

\d匹配数字。 +说要匹配前面的一个或多个。所以\d+是1位或更多位数。

()捕获内容。

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

?说要捕获前面的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上玩它。

© www.soinside.com 2019 - 2024. All rights reserved.