我正在寻找以下表达式的正则表达式:
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作为输出,请指正。 任何人都可以帮助我吗?
答案 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”。