Regex Perl正则表达式,用于所有可能为十进制和负数的数字

Regex Perl正则表达式,用于所有可能为十进制和负数的数字,regex,perl,Regex,Perl,我有一个从weather bug下载天气数据的字符串。在气温变冷之前一切都很好,现在我的负数被扔掉了 # sample input: 0.0mm|1028.11s|75%|-4| # expected output: precip:0.0 pressure:1028.11 humidity:75 temp:-4 $output =~ s/[^\d.|]+//g 单位已经知道了,所以所有的字母字符都会被丢弃,还有百分比符号等等,但是我需要上面降水量和气压的小数点,但是我还需要低温的负号。到目前为

我有一个从weather bug下载天气数据的字符串。在气温变冷之前一切都很好,现在我的负数被扔掉了

# sample input: 0.0mm|1028.11s|75%|-4|
# expected output: precip:0.0 pressure:1028.11 humidity:75 temp:-4
$output =~ s/[^\d.|]+//g
单位已经知道了,所以所有的字母字符都会被丢弃,还有百分比符号等等,但是我需要上面降水量和气压的小数点,但是我还需要低温的负号。到目前为止,上述正则表达式中的负号正在被剔除

感谢您的帮助

[^\d.|-]+
试试这个。请看演示。将-添加到角色列表中


将行拆分,然后删除不应存在的字符:

use v5.14;

my $string = '0.0mm|1028.11s|75%|-4|';

my @keys = qw(precip  pressure humidity  temp);

my %hash;
@hash{ @keys } = map { s/[^0-9.-]//gr } split /\|/, $string;

use Data::Dumper;
say Dumper( \%hash );
此程序中执行替换的部分位于地图内:

它使用了我最喜欢的Perl 5.14特性:

我也不使用\d来匹配数字,因为Perl现在允许它匹配所有UCS数字字符。相反,我只指定了0-9。看


剩下的只是将提取的数据与输出中显示的键一起放入散列中的一种方法。

将输入与预期输出一起发布。编辑发布以反映。所有内容都存储在数组中,因此我可以适当地为每个元素添加前缀。
s/[^0-9.]//gr