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中文网其他相关文章!