需要正则表达式-perl



我正在为以下表达式寻找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]有点过分,通常可以用它们各自的大写字母否定一些退格特殊类(dhsw)。

试试这个正则表达式:

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

它应该匹配1+位数字,如果有一个、0个或多个小数点,则为小数点,并确保后面跟着"s"。

最新更新