首页 > 后端开发 > Golang > 如何在 Go 中高效地找到所有重叠的模式匹配?

如何在 Go 中高效地找到所有重叠的模式匹配?

Patricia Arquette
发布: 2024-12-04 10:04:10
原创
888 人浏览过

How Can I Efficiently Find All Overlapping Pattern Matches in Go?

Golang 中的重叠模式匹配:综合指南

考虑到 regexp 包的限制,匹配重叠模式可能会给 Go 带来挑战。本文深入研究了一种替代方法,利用 strings.Index 的简单性和高效性来有效实现重叠模式匹配。

问题:

给定一个字符串和一个模式,例如“..#..”,我们的目标是找到该模式的所有实例,无论它们是否重叠。现有的 regexp.FindAllStringSubmatchIndex 方法仅捕获非重叠匹配。

解决方案:

我们不依赖 regexp,而是使用 strings.Index 和 构建自定义解决方案一个对于循环:

func FindOverlappingPattern(input, pattern string) []int {
    idx := []int{}
    j := 0
    for {
        i := strings.Index(input[j:], pattern)
        if i == -1 {
            break
        }
        fmt.Println(j)
        idx = append(idx, j+i)
        j += i + len(pattern)
    }
    fmt.Println("Indexes:", idx)
    return idx
}
登录后复制

解释:

此函数使用 strings.Index 在输入字符串的剩余部分中迭代搜索模式。找到的每个正索引都会添加到索引列表中。循环继续,直到找不到更多匹配项。

示例用法:

input := "...#...#....#.....#..#..#..#......."
pattern := "..#.."
result := FindOverlappingPattern(input, pattern)
// result: [1, 10, 16, 22, 29]
登录后复制

优点:

这种方法很简单,并且利用了 Go 的原生字符串搜索功能。对于简单的模式匹配任务,它在简单性和效率方面都优于基于正则表达式的解决方案。

以上是如何在 Go 中高效地找到所有重叠的模式匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板