Такое делается предварительной токенизацией и потом поиском по токенам.
Например так:
https://go.dev/play/p/p5-eLLx1ilr
С помощью регулярки указываем, какие символы не могут быть внутри слова (\s означает все пробельные символы, а дальше идёт перечисление знаков препинания).
Потом делаем Split по регулярке, получаем набор токенов (слов), кладём их в мапу для быстрого поиска (можно оставить в массиве, если искать слово надо один раз).
Если нужна возможность искать фразы (а они содержат пробелы), то индекс уже по-другому придется строить, самый простой способ — после токенизации сделать strings.Join(str, " "), тогда разделитель будет строго пробел на выходе.
package main
import (
"fmt"
"regexp"
)
func main() {
tokens := tokenize("something, something1, othersomething")
fmt.Println(tokens)
fmt.Println("some", tokens.containsWord("some"))
fmt.Println("thing", tokens.containsWord("thing"))
fmt.Println("something", tokens.containsWord("something"))
}
var re = regexp.MustCompile(`[\s,.;"']+`)
type TokenizedString map[string]struct{}
func tokenize(str string) TokenizedString {
list := re.Split(str, -1)
tokens := make(map[string]struct{}, len(list))
for _, token := range list {
tokens[token] = struct{}{}
}
return tokens
}
func (t TokenizedString) containsWord(word string) bool {
_, ok := t[word]
return ok
}