如何匹配所有重叠的模式

3
我希望能够获取以下字符串中模式(\.\.#\.\.)的索引:

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

但是Golang不管理重叠匹配。因此我得到了:[[1 6 1 6] [10 15 10 15] [16 21 16 21] [22 27 22 27]]。正如你所看到的,两个点“.”在第二个“#”之前和之后,但它没有被方法FindAllStringSubmatchIndex返回。我尝试使用regexp的不同方法,但没有成功。在搜索文档时,我在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)
        }

不要使用正则表达式来完成这个任务。可以使用 strings.Index 函数和一个 for 循环来实现。 - undefined
3
问题在于Go正则表达式(由RE2引擎驱动)不支持环视操作,因此您无法多次匹配相同的文本。 您不能仅使用一个简单的正则表达式来解决这个问题。 - undefined
1
@WiktorStribiżew 谢谢,这就是我想要的答案。 - undefined
2个回答

6

这个任务没有必要使用正则表达式。正则表达式对于如此简单的任务来说过于复杂和低效了。相反,你应该使用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)

Playground link


1
谢谢。所以golang实现的正则表达式不支持重叠匹配吗? - undefined
1
我不知道。对于这么简单的问题,无论是用任何语言,都没有理由使用正则表达式。不要让你的代码变得过于复杂。 - undefined

4

Go适用于程序员。例如,

package main

import (
    "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]

正则表达式参考资料:

正则表达式匹配可以简单又快速

实现正则表达式

[regexp/]syntax包


1
谢谢。所以golang实现的正则表达式不支持重叠匹配吗? - undefined
我在我的答案中添加了正则表达式的参考资料。 - undefined
"Go是为程序员而生的。所以你必须亲自编写所有内容吗?" - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接