我有两种方式的 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 .
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-trip
或rtt
子串\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/