Метод regexp.Regexp.SubexpIndex

Метод regexp.Regexp.SubexpIndex возвращает индекс именованной подгруппы (subexpression) в регулярном выражении по её имени. Он полезен для работы с именованными захватывающими группами, когда необходимо получить числовой индекс группы для использования в других методах, таких как FindStringSubmatch или FindStringSubmatchIndex. Если группа с указанным именем не найдена, метод возвращает -1. Метод принимает один параметр - имя подгруппы в виде строки.

Синтаксис

gore.SubexpIndex(name)

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

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

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

go1

Индекс 1 соответствует первой захватывающей группе, поскольку индекс 0 всегда соответствует всему совпадению.

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(?P<first>[a-z]+) (?P<last>[a-z]+)`)
  yearIdx := re.SubexpIndex("first")
  monthIdx := re.SubexpIndex("last")
  fmt.Println(yearIdx, monthIdx)
}

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

go1 2

Пример

Давайте проверим, что будет возвращено при запросе несуществующей подгруппы:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(?P<name>[a-z]+)`)
  res := re.SubexpIndex("unknown")
  fmt.Println(res)
}

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

go-1

Метод возвращает -1, если подгруппа с указанным именем не найдена в регулярном выражении.

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(?P<product>[a-z]+)-(?P<code>\d+)`)
  text := "item-12345"
  matches := re.FindStringSubmatch(text)
  idx := re.SubexpIndex("code")
  if idx != -1 && idx < len(matches) {
    fmt.Println(matches[idx])
  }
}

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

go"12345"

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

  • метод Regexp.SubexpNames,
    который возвращает имена всех подгрупп в регулярном выражении
  • метод Regexp.FindStringSubmatch,
    который находит совпадения и возвращает их в виде среза строк
  • метод Regexp.FindStringSubmatchIndex,
    который возвращает индексы совпадений подгрупп
  • метод Regexp.NumSubexp,
    который возвращает количество подгрупп в регулярном выражении