Perl正则表达式提取浮点数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl正则表达式提取浮点数相关的知识,希望对你有一定的参考价值。
我需要修改某人的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
应该是什么。
谢谢。
答案
更新后,您需要的表达式是:
^d+(?:.d+)?
^d+
在字符串开头匹配数字。(?:
开始非捕获组。.d+
匹配文字.
,后跟数字。)?
关闭非捕获组,使其成为可选项。
检查表达式here。
Perl示例:
$var = "123.456.789";
print "old $var
";
$var =~ /(^d+(?:.d+)?)/;
print "new $1
";
打印:
old 123.456.789
new 123.456
另一答案
所以我正在尝试建议的表达式,我想我没有在Perl中正确使用它们:
my $var = "123.456.66";
print "old $var
";
$var =~ s/^d+(?:.d+)?//;
print "new $var
";
输出:
$perl main.pl
old 123.456.66
new .66
另一答案
据我了解,您需要从字符串中提取前一个或两个数字组。像这样。
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上玩它。
以上是关于Perl正则表达式提取浮点数的主要内容,如果未能解决你的问题,请参考以下文章