Метод regexp.Regexp.FindAllSubmatch
Метод FindAllSubmatch выполняет поиск всех непересекающихся
совпадений регулярного выражения в байтовом срезе. В первый параметр
мы передаем байтовый срез для поиска, во второй параметр мы передаем
целое число, которое определяет максимальное количество совпадений.
Метод возвращает срез срезов байтовых срезов, где каждый внутренний
срез содержит полный текст совпадения и текст всех подвыражений
(групп) в том порядке, в котором они определены в регулярном выражении.
Если совпадений нет, метод возвращает nil.
Особенность метода в том, что он возвращает данные в виде байтовых
срезов ([][]byte), а не строк. Это делает его удобным для
работы с бинарными данными или когда важна производительность.
Чтобы получить результат в виде строк, используйте метод
FindAllStringSubmatch.
Второй параметр n определяет максимальное количество
возвращаемых совпадений. Если передать -1, метод вернет
все возможные совпадения. Если передать 0 или отрицательное
число, кроме -1, результат будет nil.
Синтаксис
re.FindAllSubmatch(b, n)
Пример
Давайте найдем все совпадения с подвыражениями в строке:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(\d{2})-(\d{2})-(\d{4})`)
b := []byte("Даты: 12-05-2023 и 25-12-2024")
res := re.FindAllSubmatch(b, -1)
for _, match := range res {
fmt.Printf("Полное совпадение: %s\n", match[0])
fmt.Printf("День: %s, Месяц: %s, Год: %s\n", match[1], match[2], match[3])
}
}
Результат выполнения кода:
"Полное совпадение: 12-05-2023"
"День: 12, Месяц: 05, Год: 2023"
"Полное совпадение: 25-12-2024"
"День: 25, Месяц: 12, Год: 2024"
Пример
Давайте найдем все совпадения с подвыражениями для извлечения имен и возрастов из текста:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`([A-Z][a-z]+) is (\d+) years old`)
b := []byte("Alice is 25 years old, Bob is 30 years old, Charlie is 35 years old")
res := re.FindAllSubmatch(b, -1)
for _, match := range res {
fmt.Printf("Name: %s, Age: %s\n", match[1], match[2])
}
}
Результат выполнения кода:
"Name: Alice, Age: 25"
"Name: Bob, Age: 30"
"Name: Charlie, Age: 35"
Пример
Давайте ограничим количество совпадений с помощью второго
параметра n:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(\d+)x(\d+)`)
b := []byte("Размеры: 1920x1080, 1280x720, 640x480")
res := re.FindAllSubmatch(b, 2)
fmt.Printf("Количество совпадений: %d\n", len(res))
for _, match := range res {
fmt.Printf("Ширина: %s, Высота: %s\n", match[1], match[2])
}
}
Результат выполнения кода:
"Количество совпадений: 2"
"Ширина: 1920, Высота: 1080"
"Ширина: 1280, Высота: 720"
Смотрите также
-
метод
FindAllStringSubmatch,
который возвращает совпадения в виде строк -
метод
FindSubmatch,
который находит только первое совпадение -
метод
FindAll,
который находит все совпадения без подвыражений -
метод
FindAllString,
который находит все совпадения в виде строк