如何匹配所有重叠的图案

Pou*_*hor 3 regex go

(\.\.#\.\.)我想在以下字符串中获取以下模式的索引:

...#...#....#.....#..#..#..#.......
Run Code Online (Sandbox Code Playgroud)

但 Golang 不管理重叠匹配。

因此我得到:[[1 6 1 6] [10 15 10 15] [16 21 16 21] [22 27 22 27]]

正如我们所看到的,.在第二个点之前和之后确实有两个点#,但该方法不会返回它FindAllStringSubmatchIndex

我尝试使用正则表达式中的不同方法但没有成功。搜索文档,我在https://golang.org/pkg/regexphttps://golang.org/src/regexp/regexp.go上没有发现任何有用的东西

相反,似乎 regexp 本身并不支持此功能:

// 如果存在“All”,则例程匹配整个表达式的连续非重叠匹配。

我可以解决这个问题,但由于我正在做这个练习来学习 Golang,所以我想知道。谢谢 :)

这是我的代码供参考:

        matches := r.pattern.FindAllStringSubmatchIndex(startingState)
        fmt.Println(r.pattern)
        fmt.Println(matches)
        for _, m := range matches {
            tempState = tempState[:m[0]+2] + "#" + tempState[m[0]+3:]
            fmt.Println(tempState)
        }
Run Code Online (Sandbox Code Playgroud)

Fli*_*mzy 5

没有理由为此使用正则表达式。正则表达式对于这样一个简单的任务来说有点大材小用——它过于复杂,而且效率较低。相反,您应该只使用strings.Index, 和 for 循环:

input := "...#...#....#.....#..#..#..#......."
idx := []int{}
j := 0
for {
    i := strings.Index(input[j:], "..#..")
    if i == -1 {
        break
    }
    fmt.Println(j)
    idx = append(idx, j+i)
    j += i+1
}
fmt.Println("Indexes:", idx)
Run Code Online (Sandbox Code Playgroud)

游乐场链接