Метод regexp.Regexp.SubexpIndex
Метод regexp.Regexp.SubexpIndex возвращает индекс
именованной подгруппы (subexpression) в регулярном
выражении по её имени. Он полезен для работы с
именованными захватывающими группами, когда необходимо
получить числовой индекс группы для использования в
других методах, таких как FindStringSubmatch
или FindStringSubmatchIndex. Если группа с
указанным именем не найдена, метод возвращает -1.
Метод принимает один параметр - имя подгруппы в виде
строки.
Синтаксис
re.SubexpIndex(name)
Пример
Давайте получим индекс именованной подгруппы "year" в регулярном выражении для разбора даты:
package 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)
}
Результат выполнения кода:
1
Индекс 1 соответствует первой захватывающей группе, поскольку индекс 0 всегда соответствует всему совпадению.
Пример
Давайте получим индексы всех именованных подгрупп в регулярном выражении:
package 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)
}
Результат выполнения кода:
1 2
Пример
Давайте проверим, что будет возвращено при запросе несуществующей подгруппы:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(?P<name>[a-z]+)`)
res := re.SubexpIndex("unknown")
fmt.Println(res)
}
Результат выполнения кода:
-1
Метод возвращает -1, если подгруппа с указанным именем не найдена в регулярном выражении.
Пример
Давайте используем полученный индекс для извлечения значения подгруппы из совпадения:
package 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])
}
}
Результат выполнения кода:
"12345"
Смотрите также
-
метод
Regexp.SubexpNames,
который возвращает имена всех подгрупп в регулярном выражении -
метод
Regexp.FindStringSubmatch,
который находит совпадения и возвращает их в виде среза строк -
метод
Regexp.FindStringSubmatchIndex,
который возвращает индексы совпадений подгрупп -
метод
Regexp.NumSubexp,
который возвращает количество подгрупп в регулярном выражении