(\.\.#\.\.)我想在以下字符串中获取以下模式的索引:
...#...#....#.....#..#..#..#.......
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/regexp和https://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)
没有理由为此使用正则表达式。正则表达式对于这样一个简单的任务来说有点大材小用——它过于复杂,而且效率较低。相反,您应该只使用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)