perl - 用于浮点数过滤器的正则表达式

时间:2014-03-18 10:53:17

标签: regex perl floating-point

我需要删除浮点数中不需要的所有字符。

例如: 1)。 12.23xf00 - >它应该是12.23 2)。 15.0s->它应该是15.0

我试过了:

sub retain_num_chars($) {
my $string = shift;
$string =~ (?:^|(?<=\s))[0-9]*\.?[0-9](?=\s|$);
return $string;
}
$string=~ retain_num_chars($string);

来自Regex Matching numbers with floating point

但它返回一个错误:不匹配(在正则表达式中;由&lt; - HERE in m /:^ |(&lt; - HERE

)标记

谢谢。我是perl的新人。

4 个答案:

答案 0 :(得分:0)

这将完成你的工作:

(?=[^\d\.])(.*)

将捕获任何非小数非小数

你可以替换它

?= means a positive lookahead, which means that what follows is a non digit non .

演示:http://regex101.com/r/zH6jA8

答案 1 :(得分:0)

您的Perl代码中存在多个错误。

首先是在函数内部。我没有看到你在那里使用正则表达式(s///)或其他任何替换操作。使用以下两行,您可以从数字中删除不需要的东西。

## assuming the format is ...dd.ddxxx
$string =~ s/^\s+(?=\d)//;  ## remove space from begin
$string =~ s/(\.\d+).*/$1/; ## removing other things after keeping the dot and digits

在函数调用期间,您尝试使用=~运算符进行分配,该运算符通常进行正则表达式匹配。因此,将其更改为=

$string = retain_num_chars($string);

答案 2 :(得分:0)

利用阿比盖尔的Regexp :: Common

use Regexp::Common;
...
... m/$RE{num}{real}/

答案 3 :(得分:0)

怎么样:

$string =~ /(?<!\d)\d+(?:\.\d+)?(?!\d);