regexp.Regexp.Expand

Метод Expand применяется к объекту Regexp и выполняет подстановку шаблона, заменяя специальные конструкции вида $name или ${name} на соответствующие значения из результатов поиска. В первый параметр передается слайс байт, в который будет записан результат (обычно используется nil для создания нового). Второй параметр - шаблон для подстановки. Третий параметр - исходный текст в виде слайса байт. Четвертый параметр - слайс байт, содержащий подстроки, найденные при помощи метода FindSubmatch или подобных.

Синтаксис

gore.Expand(dst, template, src, match)

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\w+)=(\w+)`)
  src := []byte("key=value")
  match := re.FindSubmatch(src)

  template := []byte("matched: $1 -> $2")
  res := re.Expand(nil, template, src, match)

  fmt.Println(string(res))
}

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

go"matched: key -> value"

Пример

Используем конструкцию ${name} для подстановки значения с указанием имени группы:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(?P<first>\w+)=(?P<second>\w+)`)
  src := []byte("user=admin")
  match := re.FindSubmatch(src)

  template := []byte("${first} is ${second}")
  res := re.Expand(nil, template, src, match)

  fmt.Println(string(res))
}

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

go"user is admin"

Пример

Используем существующий буфер для записи результата, чтобы избежать выделения новой памяти:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`(\d{2}):(\d{2})`)
  src := []byte("time: 12:34")
  match := re.FindSubmatch(src)

  template := []byte("hours: $1, minutes: $2")
  dst := make([]byte, 0, 50)
  dst = re.Expand(dst, template, src, match)

  fmt.Println(string(dst))
}

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

go"hours: 12, minutes: 34"

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

  • метод ExpandString,
    который работает со строковыми данными вместо байтовых слайсов
  • метод ReplaceAll,
    который выполняет замену по регулярному выражению
  • метод ReplaceAllString,
    который заменяет все вхождения строки по шаблону
  • метод FindSubmatch,
    который возвращает слайс найденных подстрок для использования с Expand