去测试字符串包含子字符串

我如何检查一个字符串是否是另一个字符串的子字符串? 例如,我想检查someString.contains("something").

190803 次浏览

使用字符串包中的Contains函数。

import (
"strings"
)
strings.Contains("something", "some") // true

相比之下,我们有更多的选择:

import (
"fmt"
"regexp"
"strings"
)


const (
str    = "something"
substr = "some"
)


// 1. Contains
res := strings.Contains(str, substr)
fmt.Println(res) // true


// 2. Index: check the index of the first instance of substr in str, or -1 if substr is not present
i := strings.Index(str, substr)
fmt.Println(i) // 0


// 3. Split by substr and check len of the slice, or length is 1 if substr is not present
ss := strings.Split(str, substr)
fmt.Println(len(ss)) // 2


// 4. Check number of non-overlapping instances of substr in str
c := strings.Count(str, substr)
fmt.Println(c) // 1


// 5. RegExp
matched, _ := regexp.MatchString(substr, str)
fmt.Println(matched) // true


// 6. Compiled RegExp
re = regexp.MustCompile(substr)
res = re.MatchString(str)
fmt.Println(res) // true
< p >基准: Contains在内部调用Index,因此速度几乎相同(顺便说一下,Go 1.11.5比Go 1.14.3显示出更大的差异)
BenchmarkStringsContains-4              100000000               10.5 ns/op             0 B/op          0 allocs/op
BenchmarkStringsIndex-4                 117090943               10.1 ns/op             0 B/op          0 allocs/op
BenchmarkStringsSplit-4                  6958126               152 ns/op              32 B/op          1 allocs/op
BenchmarkStringsCount-4                 42397729                29.1 ns/op             0 B/op          0 allocs/op
BenchmarkStringsRegExp-4                  461696              2467 ns/op            1326 B/op         16 allocs/op
BenchmarkStringsRegExpCompiled-4         7109509               168 ns/op               0 B/op          0 allocs/op