Метод regexp.Regexp.SubexpNames

Метод SubexpNames возвращает срез строк, содержащий имена всех подвыражений (capturing groups) регулярного выражения, в порядке их объявления. Первый элемент среза всегда является пустой строкой, так как он соответствует всему регулярному выражению. Если подвыражение не имеет имени, соответствующий элемент среза будет пустой строкой.

Синтаксис

goregexp.SubexpNames() []string

Пример

Давайте получим имена подвыражений для регулярного выражения с именованными группами:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`)
  names := re.SubexpNames()
  fmt.Println(names)
}

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

go["" year month day]

Как видим, первый элемент среза пустой, а остальные содержат имена подвыражений.

Пример

Давайте получим имена подвыражений для регулярного выражения, где некоторые группы не имеют имени:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(a)(?P<second>b)(c)`)
  names := re.SubexpNames()
  fmt.Println(names)
}

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

go[""  second ]

В данном примере первое и третье подвыражения не имеют имени, поэтому соответствующие элементы среза пустые. Только второе подвыражение имеет имя "second".

Пример

Давайте используем метод SubexpNames вместе с методом FindStringSubmatch для сопоставления имен групп с их значениями:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(?P<first>[a-z]+)-(?P<second>\d+)`)
  text := "abc-123"
  matches := re.FindStringSubmatch(text)
  names := re.SubexpNames()
  
  for i, match := range matches {
    if names[i] != "" {
      fmt.Printf("%s: %s\n", names[i], match)
    }
  }
}

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

go"first: abc"
"second: 123"

В этом примере мы получаем срез совпадений и срез имен, затем сопоставляем их, чтобы вывести значения только для именованных групп.

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

  • метод regexp.Regexp.SubexpIndex,
    который возвращает индекс подвыражения по его имени
  • метод regexp.Regexp.NumSubexp,
    который возвращает количество подвыражений в регулярном выражении
  • метод regexp.Regexp.FindStringSubmatch,
    который возвращает срез совпадений для подвыражений
  • функцию regexp.MustCompile,
    которая компилирует регулярное выражение и вызывает панику в случае ошибки