亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何匹配所有重疊模式

如何匹配所有重疊模式

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 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號