regex - 在golang中捕获ping命令的结果

标签 regex go

我有两种方式的 ping 命令结果->

1->5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.067/0.078/0.087/0.007 ms

2->5 packets transmitted, 5 received, 0% packet loss, time 801ms
rtt min/avg/max/stddev = 0.019/0.034/0.044/0.010 ms, ipg/ewma 200.318/0.038 ms

这些是 ping 命令在两个不同平台上的结果。 现在,在这两种情况下,我都希望得到 avg/stddev 的值。 我写了一个正则表达式-

var latencyPattern = regexp.MustCompile("(round-trip|rtt) .* = (.*)/(.*)/(.*)/(.*) *ms,")
if matches := latencyPattern.FindStringSubmatch(strOutput); len(matches) >= 5{
    latency, _ = strconv.ParseFloat(strings.TrimSpace(matches[3]), 64)
    jitter, _ = strconv.ParseFloat(strings.TrimSpace(matches[5]), 64)
}

现在这个模式对于 ping 的第二个结果工作正常(给我 0.034 和 0.01 作为结果)。但是对于结果 1,它无法找到模式(即给出 0.078 和 0.007)。 如何更改正则表达式以同时适用于两者?

最佳答案

定义正则表达式时需要更加精确。 .* 过于贪婪并且匹配逗号和其他内容。

我建议使用

var latencyPattern = regexp.MustCompile(`(round-trip|rtt)\s+\S+\s*=\s*([0-9.]+)/([0-9.]+)/([0-9.]+)/([0-9.]+)\s*ms`)

参见 regex demo .

Go lang demo :

package main

import (
    "fmt"
    "regexp"
    "strings"
    "strconv"
)

func main() {
    strOutput := `1->5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.067/0.078/0.087/0.007 ms 
        2->5 packets transmitted, 5 received, 0% packet loss, time 801ms
rtt min/avg/max/stddev = 0.019/0.034/0.044/0.010 ms, ipg/ewma 200.318/0.038 ms`
    latencyPattern := regexp.MustCompile(`(round-trip|rtt)\s+\S+\s*=\s*([0-9.]+)/([0-9.]+)/([0-9.]+)/([0-9.]+)\s*ms`)
    matches := latencyPattern.FindAllStringSubmatch(strOutput, -1)
    for _, item := range matches {
        latency, _ := strconv.ParseFloat(strings.TrimSpace(item[3]), 64)
            jitter, _ := strconv.ParseFloat(strings.TrimSpace(item[5]), 64)
            fmt.Printf("AVG = %.3f, STDDEV = %.3f\n", latency, jitter)

        }
}

结果:

AVG = 0.078, STDDEV = 0.007
AVG = 0.034, STDDEV = 0.010

图案细节:

  • (round-trip|rtt) - round-triprtt 子串
  • \s+ - 1+ 个空格
  • \S+ - 1+ 个非空白符号
  • \s*=\s* - 包含 0+ 个空格的 =
  • ([0-9.]+) - 第 1 组:第一个数字
  • / - 一个/
  • ([0-9.]+) - 第 2 组:第二个数字
  • / - 一个/
  • ([0-9.]+) - 第 3 组:第三个数字
  • / - 一个/
  • ([0-9.]+) - 第 4 组:第四个数字
  • \s* - 0+ 个空格
  • ms - 子串 ms

关于regex - 在golang中捕获ping命令的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44516601/

相关文章:

javascript - 无法捕获 JavaScript 正则表达式中的匹配项

regex - 正则表达式以匹配两个单独的短语

xml - 使用 golang 编码/xml 解码 GML 时出错

json - golang 解析一个复杂的字符串为json

unit-testing - 运行 goapp test 时 main.main not defined 错误

regex - XSLT 2.0 : regex extract and modify element value

javascript - RegEx - 解析特定单词的字符串

go - 如何使用反射在 Go 中查找空结构值?

go - 将 go 应用程序部署到 docker 时遇到问题

php - 创建一个简单但灵活的模板引擎