Метод regexp.Regexp.ExpandString

Метод ExpandString расширяет переданную строку-шаблон, заменяя в ней специальные конструкции вида $name или ${name} на соответствующие значения из найденного совпадения. Первым параметром метод принимает слайс байт для записи результата, вторым - строку шаблона, третьим - строку с исходным текстом, четвертым - найденное совпадение в виде слайса байт.

Синтаксис

gore.ExpandString(dst []byte, template string, src string, match []int)

Пример

Давайте используем метод ExpandString для замены $name на подстроку, найденную по регулярному выражению:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`Hello, (\w+)!`)
  src := "Hello, Go!"
  match := re.FindStringSubmatchIndex(src)

  if match != nil {
    dst := []byte("Greeting: $name")
    res := re.ExpandString(dst, "Greeting: $name", src, match)
    fmt.Println(string(res))
  }
}

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

go"Greeting: Go"

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\w+), (\w+)!`)
  src := "Hello, Go!"
  match := re.FindStringSubmatchIndex(src)

  if match != nil {
    dst := []byte("")
    res := re.ExpandString(dst, "First: $1, Second: $2", src, match)
    fmt.Println(string(res))
  }
}

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

go"First: Hello, Second: Go"

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(?P<greeting>\w+), (?P<name>\w+)!`)
  src := "Hello, Go!"
  match := re.FindStringSubmatchIndex(src)

  if match != nil {
    dst := []byte("")
    res := re.ExpandString(dst, "${greeting} to ${name}", src, match)
    fmt.Println(string(res))
  }
}

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

go"Hello to Go"

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
  src := "2026-09-04"
  match := re.FindStringSubmatchIndex(src)

  if match != nil {
    dst := []byte("")
    res := re.ExpandString(dst, "Year: $1, Month: $2, Day: $3", src, match)
    fmt.Println(string(res))
  }
}

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

go"Year: 2026, Month: 09, Day: 04"

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

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