为了账号安全,请及时绑定邮箱和手机立即绑定

如何匹配所有重叠模式

如何匹配所有重叠模式

Go
MMTTMM 2023-05-22 17:05:22
(\.\.#\.\.)我想在以下字符串中获取以下模式的索引:...#...#....#.....#..#..#..#.......但是 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)        }
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超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)

游乐场链接


查看完整回答
反对 回复 2023-05-22
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

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]

查看完整回答
反对 回复 2023-05-22
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信