0

我在文件中有以下值

Time:       3.610 [ms] (mean)
Time:       1.805 [ms] (mean, across all concurrent requests)

我需要第一行 3.610 中的十进制值,为此我使用以下正则表达式,但正则表达式返回第二行 1.805 中的值

while (<FILE>) {
            if ($_ =~ /Time:\s*(\d+\.\d+)\s*\S+/)      {
                    $time= $1;
                    print "\ntime: $time\n";
            }

有人可以帮我吗?

4

5 回答 5

1

它可能会打印两个值,但问题是如何仅提取第一个值

您没有在原始问题中说明这一点。正如其他人提到的,使用last

while (<FILE>) {
    if ($_ =~ /Time:\s*(\d+\.\d+)\s*\S+/) {
       $time = $1;
       print "\ntime: $time\n";
       last;    #This will leave the "while" loop as soon as it find a match.
    }
}

您还可以将所有条目放入一个数组中,并以这种方式访问​​您想要的任何条目:

my @time_list;
while (<FILE>) {
    if ($_ =~ /Time:\s*(\d+\.\d+)\s*\S+/) {
       $time = $1;
       print "\ntime: $time\n";
       push @time_list, $time;
    }
}

print "First time is $time_list[0]\n";
于 2013-05-01T21:54:09.593 回答
0

您可以使用:

/Time:\s*([\d.]+).*/

测试如下:

> echo "Time:       3.610 [ms] (mean)"|perl -lne 'print $1 if(/Time:\s*([\d.]+).*/)'
3.610
> echo "Time:       1.805 [ms] (mean, across all concurrent requests)"|perl -lne 'print $1 if(/Time:\s*([\d.]+).*/)'
1.805
> 
于 2013-05-02T06:17:25.060 回答
0

看看这个模式:

(?<!\)\s)Time:\s*(\d+\.\d+)

无需调用任何其他函数来提取第一个匹配项或使用 break 语句。它只会给你第一个结果集。

希望能帮助到你!

于 2013-05-02T05:32:46.677 回答
0

要仅获取第一个值,只需last;在打印值后退出循环(使用 )。

while (<FILE>) {
        if ($_ =~ /Time:\s*(\d+\.\d+)\s*\S+/)      {
                $time= $1;
                print "\ntime: $time\n";
                last;
        }
于 2013-05-01T19:32:37.513 回答
0

考虑以下通用正则表达式的 powershell 示例。

Time:\s*((?<![.])[0-9]*?([.][0-9]{1,})?)\s

例子

    $Matches = @()
    $String = 'Time:       3.610 [ms] (mean)
Time:       1.805 [ms] (mean, across all concurrent requests)'
    Write-Host start with 
    write-host $String
    Write-Host
    Write-Host found
    ([regex]'Time:\s*((?<![.])[0-9]*?([.][0-9]{1,})?)\s').matches($String) | foreach {
        write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
        } # next match

产量

start with
Time:       3.610 [ms] (mean)
Time:       1.805 [ms] (mean, across all concurrent requests)

found
key at 12 = '3.610'
key at 43 = '1.805'

概括

  • ((?<![.])[0-9]*?([.][0-9]{1,})?)返回出现在“时间:”之后和时间和“[ms]”之间的空格之前的所有小数,有效数字最多只能有一个小数点
  • 最后的逻辑解析所有找到的匹配值
  • 当在 powershell 中使用正则表达式进行匹配时,会自动填充 $matches 数组
于 2013-05-01T20:41:43.897 回答