如何匹配所有重叠模式

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

...#...#....#.....#..#..#..#.......

但是 Golang 不管理重叠匹配。

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

正如您所看到的,两个点.确实在第二个点之前和后缀#,但它不是由方法返回的FindAllStringSubmatchIndex

我尝试使用与正则表达式不同的方法但没有成功。

相反,似乎 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)

        }


MMTTMM
浏览 94回答 2
2回答

慕尼黑的夜晚无繁华

没有理由为此使用正则表达式。正则表达式对于这样一个简单的任务来说太过分了——它过于复杂,而且效率较低。相反,您应该只使用strings.Index, 和一个 for 循环:input := "...#...#....#.....#..#..#..#......."idx := []int{}j := 0for {    i := strings.Index(input[j:], "..#..")    if i == -1 {        break    }    fmt.Println(j)    idx = append(idx, j+i)    j += i+1}fmt.Println("Indexes:", idx)游乐场链接

胡子哥哥

Go是给程序员的。例如,package mainimport (    "fmt"    "strings")func findIndices(haystack, needle string) []int {    var x []int    for i := 0; i < len(haystack)-len(needle); i++ {        j := strings.Index(haystack[i:], needle)        if j < 0 {            break        }        i += j        x = append(x, i)    }    return x}func main() {    haystack := `...#...#....#.....#..#..#..#.......`    needle := `..#..`    fmt.Println(findIndices(haystack, needle))}游乐场:https://play.golang.org/p/nNE5IB1feQT输出:[1 5 10 16 19 22 25]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go