Метод regexp.Regexp.ReplaceAllFunc

Метод ReplaceAllFunc используется для замены всех совпадений с регулярным выражением на результат выполнения переданной функции. В первый параметр метод принимает исходный срез байтов []byte, в котором производится поиск. Второй параметр — это функция, которая принимает срез байтов с найденным совпадением и возвращает срез байтов для замены. Метод возвращает новый срез байтов со всеми выполненными заменами. Этот метод удобен, когда логика замены зависит от самого найденного текста.

Синтаксис

gore.ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
  "strconv"
)

func main() {
  re := regexp.MustCompile(`\d+`)
  src := []byte("Numbers: 2, 4, 6")
  res := re.ReplaceAllFunc(src, func(match []byte) []byte {
    num, _ := strconv.Atoi(string(match))
    return []byte(strconv.Itoa(num * num))
  })
  fmt.Println(string(res))
}

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

go"Numbers: 4, 16, 36"

Пример

Давайте заменим все найденные слова на их длину. В функции замены вычислим длину совпадения и вернем ее в виде строки:

gopackage main

import (
  "fmt"
  "regexp"
  "strconv"
)

func main() {
  re := regexp.MustCompile(`[a-z]+`)
  src := []byte("hello world from go")
  res := re.ReplaceAllFunc(src, func(match []byte) []byte {
    return []byte(strconv.Itoa(len(match)))
  })
  fmt.Println(string(res))
}

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

go"5 5 4 2"

Пример

Если необходимо заменить совпадения на разные значения в зависимости от их содержимого, например, заменить числа на их текстовые эквиваленты для небольшого диапазона:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`[0-9]`)
  src := []byte("1 2 3 4 5")
  res := re.ReplaceAllFunc(src, func(match []byte) []byte {
    digits := map[string]string{
      "1": "one",
      "2": "two",
      "3": "three",
    }
    if val, ok := digits[string(match)]; ok {
      return []byte(val)
    }
    return match
  })
  fmt.Println(string(res))
}

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

go"one two three 4 5"

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

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