该段代码中的正则表达式匹配操作是整个程序的瓶颈,因为它需要对整个文件内容进行正则匹配,而文件可能非常大,这会导致性能问题。为了优化性能,可以考虑使用 bufio 包中的 Scanner,逐行读取文件内容,然后对每行进行正则匹配。这样可以减少一次性读取整个文件的开销,以及正则匹配的操作次数。

具体实现如下:

file, err := os.Open(path)
if err != nil {
    fmt.Printf('打开文件失败:%v
', err)
    return
}
defer file.Close()

scanner := bufio.NewScanner(file)
matchesMap := map[string]struct{}{}
for scanner.Scan() {
    line := scanner.Text()
    matches := resultRegex.FindAllStringSubmatch(line, -1)
    for _, v := range matches {
        if _, ok := matchesMap[v[0]]; ok {
            continue
        }
        matchesMap[v[0]] = struct{}{}
        res = append(res, v[0])
    }
}

if err := scanner.Err(); err != nil {
    fmt.Printf('读取文件失败:%v
', err)
    return
}

这段代码使用 Scanner 逐行读取文件内容,并对每行进行正则匹配。如果匹配到结果,则将结果存入一个 map 中,以避免重复匹配。最终将所有匹配结果存入切片 res 中返回。

这种方法的优点是可以逐行读取文件,避免一次性读取整个文件的性能问题。缺点是可能会遗漏跨行的匹配结果,但是在大多数情况下,这种情况比较少见,可以接受。

Go 语言正则表达式匹配性能优化:逐行读取文件

原文地址: https://www.cveoy.top/t/topic/nL99 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录