При разделении строки на слова могут возникнуть некоторые сложности. Во-первых, нужно определиться с тем, что из себя будет представлять слово, а также с тем, что будет рассмотрено в качестве разделителя. К примеру, это может быть пробел или какой-то другой знак. После принятия данных решений нужно выбрать подходящую функцию из пакета strings
. Рассмотрим наиболее простой случай.
Как разбить строку на слова?
Создайте файл whitespace.go
со следующим содержимым:
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" "strings" ) const refString = "Mary had a little lamb" func main() { words := strings.Fields(refString) for idx, word := range words { fmt.Printf("Word %d is: %s\n", idx, word) } } |
1. Запустите код через go run whitespace.go
;
2. Посмотрите на результат в терминале:
3. Создайте еще один файл под названием anyother.go
со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" "strings" ) const refString = "Mary_had a little_lamb" func main() { words := strings.Split(refString, "_") for idx, word := range words { fmt.Printf("Word %d is: %s\n", idx, word) } } |
4.Запустите код через go run anyother.go
;
5. Посмотрите на вывод в терминале:
6. Создайте еще один файл, он должен называться specfunction.go
, его содержимое следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package main import ( "fmt" "strings" ) const refString = "Mary*had,a%little_lamb" func main() { // splitFunc вызывается для каждой // руны в строке. Если руна // равна любому символу в "*%,_" // refString разделяется. splitFunc := func(r rune) bool { return strings.ContainsRune("*%,_", r) } words := strings.FieldsFunc(refString, splitFunc) for idx, word := range words { fmt.Printf("Word %d is: %s\n", idx, word) } } |
7. Запустите код через go run specfunction.go
;
8. Посмотрите на вывод в терминале:
Разбивает строку в массив с помощью регулярного выражения
9. Создайте другой файл, назовите его regex.go
, его содержимое следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" "regexp" ) const refString = "Mary*had,a%little_lamb" func main() { words := regexp.MustCompile("[*,%_]{1}").Split(refString, -1) for idx, word := range words { fmt.Printf("Word %d is: %s\n", idx, word) } } |
10. Запустите код через go run regex.go
;
11. Посмотрите на результат в терминале:
Функция Split() для разделения строки на слова
Наиболее простым способ разделения строки на слова является случай, где в качестве разделителей рассматриваются пробелы. Пробелы определяются функцией IsSpace
из пакета unicode
:
‘\t’, ‘\n’, ‘\v’, ‘\f’, ‘\r’, ‘ ‘, U+0085 (NEL), U+00A0 (NBSP).
Функция Fields
из пакета strings
может использоваться для разделения предложения с помощью символов пробела, как было показано ранее. Шаги 1-2 описывать первый частый случай.
Если в качестве разделителя нужен другой символ, тогда задействуется функция Split
. Использование другого разделителя описывается в шагах 3-5. Обратите внимание, что в строке опущены пробелы.
При необходимости использовать более сложную функцию при разделении строки в определенной точке можете использовать FieldsFunc
. Одним из аргументов функции является функция, что поглощает руны данной строки и возвращает значение true, если строку нужно поделить в данном месте. Данная опция описана на этапах 6-8.
Последним вариантом, упомянутым в примере, являетcя регулярное выражения. Структура Regexp
из пакета regexp
содержит метод Split
, что соответствует всем вашим ожиданиям. Он делит строку в месте совпадающей группы. Данный подход используется на этапах 9-11.
В пакете strings
есть различные функции SplitXXX
, что могут помочь выполнить более сложные задачи.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»