Метод regexp.Regexp.ReplaceAllFunc
Метод ReplaceAllFunc используется для замены всех совпадений с регулярным выражением на результат выполнения переданной функции. В первый параметр метод принимает исходный срез байтов []byte, в котором производится поиск. Второй параметр — это функция, которая принимает срез байтов с найденным совпадением и возвращает срез байтов для замены. Метод возвращает новый срез байтов со всеми выполненными заменами. Этот метод удобен, когда логика замены зависит от самого найденного текста.
Синтаксис
re.ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte
Пример
Давайте заменим все цифры в строке на их квадраты. Для этого в функции замены преобразуем найденное совпадение в число, возведем его в квадрат и вернем результат:
package 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))
}
Результат выполнения кода:
"Numbers: 4, 16, 36"
Пример
Давайте заменим все найденные слова на их длину. В функции замены вычислим длину совпадения и вернем ее в виде строки:
package 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))
}
Результат выполнения кода:
"5 5 4 2"
Пример
Если необходимо заменить совпадения на разные значения в зависимости от их содержимого, например, заменить числа на их текстовые эквиваленты для небольшого диапазона:
package 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))
}
Результат выполнения кода:
"one two three 4 5"
Смотрите также
-
метод
Regexp.ReplaceAllStringFunc,
который работает аналогично, но принимает и возвращает строки -
метод
Regexp.ReplaceAll,
который заменяет совпадения на фиксированный срез байтов -
метод
Regexp.ReplaceAllString,
который заменяет совпадения на фиксированную строку -
функцию
regexp.MustCompile,
которая компилирует регулярное выражение с паникой при ошибке