需要正则表达式 - perl

时间:2015-02-23 18:23:56

标签: perl

我正在寻找以下表达式的正则表达式:

my $text = "1170 KB/s (244475 bytes in 2.204s)";  # I want to retrieve last ‘2.204’ from this String.

$text =~ m/\d+[^\d*](\d+)/;   #Regexp

my $num = $1;

print " $num ";
Output:
204

但是我需要2.204作为输出,请指正。 任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:4)

正则表达式完全符合您的要求:它匹配数字\d+,后跟一个非数字或明星[^\d*],后跟数字{{ 1}}。与字符串匹配的唯一内容是\d+

如果您想快速修复,只需移动括号:

204

这会(与上面的输入)匹配你想要的。更准确的说法是:

m/(\d+[^\d*]\d+)/

当然这将匹配任何浮点精度数,所以如果你可以有更多这些,那不是一个好主意。您可以使用锚点来支持它,如下所示:

m/(\d+\.\d+)/

m/(\d+\.\d+)s\)/ 强制匹配仅在该位置发生。进一步限制:

s\)

您可能还想考虑目标号码是浮动的可能性:

m/\(\d+\D+(\d+\.\d+)s\)/

通过使用m/\(\d+\D+(\d+\.?\d*)s\)/ ?,我们允许这些部分完全不匹配。除非您使用锚点,否则不建议这样做。您还可以使用*替换捕获组中的所有内容。

如果您不喜欢匹配括号,可以匹配文字:

[\d.]+

答案 1 :(得分:0)

我将第二个标记作为指示符放在字符串中:

my ($num) = ($text =~ /(\d+\.\d+)s/);

解释:

/(    # start of matching group
 \d+  # first digits
 \.   # a literal '.', take \D if you want non-numbers
 \d+  # second digits
 )/x  # close the matching group and the regex

您错配了匹配的群组。 [^\d]也有点过分,通常你可以用它们各自的一些退格特殊类(\d\h\s\w)来否定它们。大写字母。

答案 2 :(得分:0)

试试这个正则表达式:

$text =~ m/\d+[^\d]*(\d+\.?\d*)s/;

如果有一个,0个或更多的小数位,则应匹配1+位,小数点,并确保后跟“s”。