Метод Regexp.FindAllStringSubmatch

Метод Regexp.FindAllStringSubmatch ищет все непересекающиеся совпадения регулярного выражения в строке и возвращает срез срезов строк. Каждый внутренний срез содержит полное совпадение и все захваченные подгруппы (подвыражения). Первым параметром метод принимает строку для поиска, вторым параметром - максимальное количество совпадений, которое нужно найти (если передать -1, будут найдены все совпадения).

Синтаксис

gore.FindAllStringSubmatch(s string, n int) [][]string

Пример

Давайте найдем все совпадения с подвыражениями в строке. В этом примере мы ищем числа с их текстовым описанием:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\d+)\s*-\s*(\w+)`)
  s := "10 - apples, 20 - oranges, 30 - bananas"
  res := re.FindAllStringSubmatch(s, -1)
  fmt.Println(res)
}

Результат выполнения кода:

go[[10 - apples 10 apples] [20 - oranges 20 oranges] [30 - bananas 30 bananas]]

Пример

Давайте ограничим количество найденных совпадений с помощью второго параметра:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\d+)\s*-\s*(\w+)`)
  s := "10 - apples, 20 - oranges, 30 - bananas"
  res := re.FindAllStringSubmatch(s, 2)
  fmt.Println(res)
}

Результат выполнения кода:

go[[10 - apples 10 apples] [20 - oranges 20 oranges]]

Пример

Давайте обработаем каждое совпадение отдельно, чтобы извлечь подвыражения:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\w+)=(\d+)`)
  s := "x=10 y=20 z=30"
  matches := re.FindAllStringSubmatch(s, -1)

  for _, match := range matches {
    key := match[1]
    value := match[2]
    fmt.Printf("key: %s, value: %s\n", key, value)
  }
}

Результат выполнения кода:

go"key: x, value: 10"
"key: y, value: 20"
"key: z, value: 30"

Пример

Если совпадений нет, метод возвращает пустой срез [][]string:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\d+)`)
  s := "abc def"
  res := re.FindAllStringSubmatch(s, -1)
  fmt.Println(res)
}

Результат выполнения кода:

go[]

Смотрите также

  • метод Regexp.FindAllString,
    который возвращает только полные совпадения без подвыражений
  • метод Regexp.FindStringSubmatch,
    который возвращает только первое совпадение с подвыражениями
  • метод Regexp.FindAllSubmatch,
    который ищет совпадения в байтовых срезах
  • функцию regexp.Compile,
    которая компилирует регулярное выражение с возможностью ошибки