Поиск и извлечение
Используйте FindString и подсовпадения
«Поиск и извлечение» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Помимо сопоставления
Сопоставление сообщает, существует ли шаблон. Семейство функций Find сообщает, что совпало и где, поэтому с его помощью можно извлекать данные.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("[0-9]+")
fmt.Println(re.FindString("order 42 ready"))
}FindString
FindString(s) возвращает первое совпадение в виде строки или пустую строку, если совпадений нет.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("[a-z]+")
fmt.Printf("%q\n", re.FindString("123abc456"))
}FindAllString
FindAllString(s, n) возвращает все совпадения в виде среза. Передайте -1, чтобы получить все совпадения, или положительное ограничение.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("[0-9]+")
fmt.Println(re.FindAllString("a1 b22 c333", -1))
}Ограничение результатов
Передайте положительное значение n, чтобы остановиться после указанного количества совпадений.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("[0-9]+")
fmt.Println(re.FindAllString("1 2 3 4", 2))
}Поиск индекса
FindStringIndex(s) возвращает позиции начала и конца первого совпадения в байтах в виде среза из двух элементов.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("cat")
fmt.Println(re.FindStringIndex("a cat here"))
}Группы захвата
Круглые скобки создают группы захвата. FindStringSubmatch возвращает сначала всё совпадение, а затем каждую захваченную группу.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("(\\d+)-(\\d+)")
m := re.FindStringSubmatch("12-34")
fmt.Println(m)
}Использование значений подсовпадений
Обращайтесь к элементам среза подсовпадений по индексу: элемент 0 — это полное совпадение, элемент 1 — первая группа и так далее.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("(\\d+):(\\d+)")
m := re.FindStringSubmatch("09:30")
fmt.Println("hour", m[1], "min", m[2])
}Именованные группы
Дайте группе имя с помощью (?P<name>...), а затем получите её через SubexpNames вместе со срезом подсовпадений.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("(?P<area>\\d{3})-(?P<num>\\d{4})")
m := re.FindStringSubmatch("555-1234")
for i, name := range re.SubexpNames() {
if name != "" {
fmt.Println(name, m[i])
}
}
}Все подсовпадения
FindAllStringSubmatch(s, n) возвращает срез срезов подсовпадений — по одному для каждого совпадения. Это удобно для разбора большого количества записей.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("(\\w+)=(\\d+)")
all := re.FindAllStringSubmatch("x=1 y=2", -1)
for _, m := range all {
fmt.Println(m[1], m[2])
}
}Поведение при отсутствии совпадений
Если ничего не совпало, методы Find возвращают пустую строку или срез nil. Проверяйте результат перед обращением по индексу, чтобы избежать паники.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("[0-9]+")
m := re.FindStringSubmatch("no digits")
fmt.Println(m == nil)
}Извлечение реальных данных
Объединяйте группы, чтобы извлекать структурированные поля из строки текста.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("(\\d{4})-(\\d{2})-(\\d{2})")
m := re.FindStringSubmatch("date: 2026-05-30")
fmt.Println("year", m[1])
}Быстрая проверка
Какой элемент среза подсовпадений содержит всё совпадение?
Повторение: поиск и извлечение
Теперь вы умеете извлекать данные из текста:
FindStringиFindAllStringвозвращают совпадения.FindStringSubmatchвозвращает полное совпадение вместе с группами захвата.- Используйте именованные группы и проверяйте значение
nil, если совпадений нет.
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("(\\w+)@(\\w+)")
m := re.FindStringSubmatch("user@host")
fmt.Println(m[1], "at", m[2])
}Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Поиск и извлечение» бесплатный?
Да — полный текст урока «Поиск и извлечение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Поиск и извлечение»?
Используйте FindString и подсовпадения Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Поиск и извлечение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы regexp
- Поиск и извлечение
- Замена текста
- Советы по производительности