我正在解析一个已自定义为只给我两个值的Apache日志:"time“和"memory”(值是毫秒数和字节数),它们都是int64或float64,但我使用regexp并对文件进行解析,所以当我匹配文件的内容时,返回"[]“(空大括号)而不是填充切片,我的代码是:
for _, line := range lines {
var buffer bytes.Buffer
buffer.WriteString(`\[0-9]+\s`)
buffer.WriteString(`[0-9]+\s`)
re1, err := regexp.Compile(buffer.String())
if err != nil {
log.Fatalf("regexp: %s", err)
}
result := re1.FindStringSubmatch(line)
fmt.Println(result)
}当我打印结果时,它给了我空大括号,当我运行整个程序时,它给出超出范围的索引(这是可以理解的,因为结果是空的)。
我的数据如下:
1040 3952
2849 6832发布于 2019-04-03 07:49:59
Regexp是这个工作的完全错误的工具。只要使用strings.Split或strings.Fields,阅读起来就容易得多,操作也要快得多。
for _, line := range lines {
fields := strings.Fields(line)
ms := fields[0]
size := fields[1]
fmt.Printf("time: %v, size: %v\n", ms, size)
}如果您想将这些转换为数字,您可以很容易地使用strconv包进行转换,如果您得到意外的(非数字的)输入,它将检测到它的额外好处):
for _, line := range lines {
fields := strings.Fields(line)
ms, err := strconv.Itoa(fields[0])
if err != nil {
log.Fatalf("time field: %s", err)
}
size, err := strconv.Atoi(fields[1])
if err != nil {
log.Fatalf("size field: %s", err)
}
fmt.Printf("time: %v, size: %v\n", ms, size)
}
如果您坚持使用正则表达式,至少只编译一次,在for循环之外:
re, err := regexp.Compile( ... )
if err != nil {
log.Fatalf("regexp: %s", err)
}
for _, line := range lines {
result := re.FindStringSubmatch(line)
fmt.Println(result)
}https://stackoverflow.com/questions/55488836
复制相似问题