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

12

我知道如果要计算一个子字符串出现的次数,可以使用 "strings.Count(, )"。但如果我想计算子字符串1或子字符串2出现的次数呢?有没有比写另一行 strings.count() 更优雅的方式?


如果你在“abb”中搜索“ab”和“bb”,有多少个出现次数?也就是说,你想要计算非重叠实例还是重叠实例? - Paul Hankin
在这种情况下,“@PaulHankin”应该只出现一次。 - Pig
3个回答

17

谢谢你提醒我正则表达式!我已经阅读了文档,但是没有找到字符串是变量的情况。所以我想知道如果单词是变量且我不知道有多少个,Golang 的正则表达式是否支持? - Pig
@IceBear:我不明白你的意思。这与正则表达式无关,你只是想知道如何格式化字符串吗? - JimB
我解决了,我创建了一个空字符串,并将变量名和“|”附加到字符串上以构造正则表达式。 - Pig

2

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

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))
}

你可以使用Lookup函数匹配单个子字符串。

0
如果你想在一个大字符串中计算匹配的数量,而不需要为了获取长度并且扔掉它们而分配所有索引的空间,你可以使用Regexp.FindStringIndex在循环中匹配连续的子字符串:
func countMatches(s string, re *regexp.Regexp) int {
    total := 0
    for start := 0; start < len(s); {
        remaining := s[start:] // slicing the string is cheap
        loc := re.FindStringIndex(remaining)
        if loc == nil {
            break
        }
        // loc[0] is the start index of the match,
        // loc[1] is the end index (exclusive)
        start += loc[1]
        total++
    }
    return total
}

func main() {
    s := "abracadabra"
    fmt.Println(countMatches(s, regexp.MustCompile(`a|b`)))
}

在 Go Playground 上运行的示例代码


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