String 计算字符串中一个或多个子字符串的出现次数

String 计算字符串中一个或多个子字符串的出现次数,string,algorithm,go,String,Algorithm,Go,我知道,为了计算一个子字符串的出现次数,我可以使用“strings.Count(,)”。如果要计算子字符串1或子字符串2的出现次数,该怎么办?还有比用strings.count()写另一行更优雅的方法吗?使用: 另一种进行子字符串匹配的方法是使用包。以下是匹配多个模式的示例: package main import ( "fmt" "index/suffixarray" "regexp" ) func main() { r := regexp.MustCom

我知道,为了计算一个子字符串的出现次数,我可以使用“strings.Count(,)”。如果要计算子字符串1或子字符串2的出现次数,该怎么办?还有比用strings.count()写另一行更优雅的方法吗?

使用:


另一种进行子字符串匹配的方法是使用包。以下是匹配多个模式的示例:

package main

import (
    "fmt"
    "index/suffixarray"
    "regexp"
)

func main() {
    r := regexp.MustCompile("an")
    index := suffixarray.New([]byte("banana"))
    results := index.FindAllIndex(r, -1)
    fmt.Println(len(results))
}

您还可以将单个子字符串与函数匹配。

如果您想在一个大字符串中计算匹配的数量,而不需要为所有索引分配空间来获得长度,然后将其丢弃,您可以在循环中使用来匹配连续的子字符串:

func countMatches(s字符串,re*regexp.regexp)int{
总数:=0
对于开始:=0;开始<长度(s){
剩余:=s[start://切片字符串很便宜
loc:=重新查找字符串索引(剩余)
如果loc==nil{
打破
}
//loc[0]是比赛的开始索引,
//loc[1]为最终索引(不含)
start+=loc[1]
总数++
}
返回总数
}
func main(){
s:=“abracadabra”
fmt.Println(countMatches(s,regexp.MustCompile(`a | b`)))
}

如果在“abb”中搜索“ab”和“bb”,出现的次数是多少?也就是说,你想计算非重叠实例还是重叠实例?@PaulHankin应该是这种情况下的一个实例。谢谢你提醒我regex!我阅读了文档,但找不到字符串是变量的情况。所以我想知道如果单词是可变的,我不知道有多少,Golang的正则表达式支持吗?@Iceear:我不明白你的意思。这与正则表达式没有任何关系,你只是想知道如何格式化字符串吗?我弄明白了,我创建了一个空字符串,并在字符串中附加变量名和“|”来构造正则表达式。
package main

import (
    "fmt"
    "index/suffixarray"
    "regexp"
)

func main() {
    r := regexp.MustCompile("an")
    index := suffixarray.New([]byte("banana"))
    results := index.FindAllIndex(r, -1)
    fmt.Println(len(results))
}