РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
439 of 1593 menu

Метод 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,
    которая компилирует регулярное выражение с паникой при ошибке
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить