我正在为以下表达式寻找regx:
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作为输出,请纠正我。有人能帮我吗?
正则表达式正按照您的要求执行:它匹配数字d+
,后跟一个非数字或星形[^d*]
,后跟数字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.]+
替换捕获组中的所有内容。
如果你不喜欢匹配括号,你可以匹配文本:
m/bytes in ([d.]+)s/
我会使用第二个标记作为字符串中的指示符:
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
)。
试试这个正则表达式:
$text =~ m/d+[^d]*(d+.?d*)s/;
它应该匹配1+位数字,如果有一个、0个或多个小数点,则为小数点,并确保后面跟着"s"。