@Djonson86
Нечем похвастаться.

Как в Golang проверить вхождение строки в строку, но слово целиком?

Например есть строка something, something1, othersomething. В строке может быть много слов, может быть одно. Надо проверить есть ли там слово целиком.
some = false
thing = false
something = true //первое слово
strings.Contains не подходит
  • Вопрос задан
  • 869 просмотров
Решения вопроса 1
@falconandy
Проще регуляркой, но не факт, что быстрее и покрывает все кейсы:
package main

import (
	"fmt"
	"regexp"
)

func main() {
	text := "something, something1, othersomething"

	fmt.Println("some", createWordRegex("some").MatchString(text))
	fmt.Println("thing", createWordRegex("thing").MatchString(text))
	fmt.Println("something", createWordRegex("something").MatchString(text))
	fmt.Println("something1", createWordRegex("something1").MatchString(text))
}

func createWordRegex(word string) *regexp.Regexp {
	return regexp.MustCompile(`\b` + regexp.QuoteMeta(word) + `\b`)
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Такое делается предварительной токенизацией и потом поиском по токенам.
Например так:
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
}
Ответ написан
Комментировать
Можно разбить строку на токены и проверять каждый токен на идентичность.
https://yourbasic.org/golang/split-string-into-slice/
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Тут - совокупность проверок
1) strings.Contains - даст положительный результат
2) по бокам от найденного Contains должны стоять не-алфавитные символы.

P.S. Это можно делать регулярками но я-бы предложил мой метод. Он кажется легче в понимании.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы