0Pricing
Go Academy · Урок

Замена текста

Заменяйте по шаблонам ReplaceAll

«Замена текста» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Замена по шаблону

Регулярные выражения могут не только находить текст, но и изменять его. ReplaceAllString заменяет каждое совпадение строкой-заменой.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.ReplaceAllString("a1b2c3", "#"))
}

Замена целых слов

Шаблон вроде cat|dog позволяет заменить несколько вариантов за один проход.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("cat|dog")
    fmt.Println(re.ReplaceAllString("my cat and dog", "pet"))
}

Свёртывание пробелов

Распространённый способ очистки: заменить последовательности пробельных символов одним пробелом с помощью \s+.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("\\s+")
    fmt.Println(re.ReplaceAllString("too   many    spaces", " "))
}

Ссылки на группы

В строке замены $1 вставляет первую группу захвата, а $2 — вторую. Так можно переставлять совпавшие части.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\d+)-(\\d+)")
    fmt.Println(re.ReplaceAllString("12-34", "$2-$1"))
}

Именованные ссылки на группы

С именованными группами для ясности можно использовать ${name} в замене.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(?P<y>\\d{4})-(?P<m>\\d{2})")
    fmt.Println(re.ReplaceAllString("2026-05", "${m}/${y}"))
}

Безопасные фигурные скобки

Используйте фигурные скобки ${1}, если после ссылки на группу идёт текст, чтобы $1 не приняли за начало более длинного имени.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\d+)")
    fmt.Println(re.ReplaceAllString("7", "${1}px"))
}

Буквальная замена

ReplaceAllLiteralString игнорирует ссылки $ и вставляет замену в точности так, как она записана.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.ReplaceAllLiteralString("a1", "$money"))
}

Замена с помощью функции

ReplaceAllStringFunc вызывает Вашу функцию для каждого совпадения и подставляет всё, что она возвращает. Это позволяет вычислять замены.

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile("[a-z]+")
    out := re.ReplaceAllStringFunc("go is fun", strings.ToUpper)
    fmt.Println(out)
}

Вычисляемая замена

Внутри функции можно преобразовать каждое совпадение как угодно; здесь каждая найденная последовательность цифр удваивается за счёт оборачивания.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    out := re.ReplaceAllStringFunc("id5 and id9", func(m string) string {
        return "<" + m + ">"
    })
    fmt.Println(out)
}

Маскирование конфиденциальных данных

Практическое применение: перед записью в журнал скрывайте числа, например последовательности цифр, похожие на номера карт.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("\\d{4}")
    fmt.Println(re.ReplaceAllString("card 1234 5678", "****"))
}

Работа с байтами

Существуют и варианты для срезов байтов, например ReplaceAll; они повторяют методы для строк при работе с двоичными данными или буферами.

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    out := re.ReplaceAll([]byte("a1b2"), []byte("#"))
    fmt.Println(string(out))
}

Быстрая проверка

Как вставить первую группу захвата в строку замены?

Итоги: замена текста

Вы научились изменять текст:

  • ReplaceAllString заменяет совпадения; $1/${name} позволяют ссылаться на группы.
  • ReplaceAllLiteralString не выполняет подстановку ссылок.
  • ReplaceAllStringFunc вычисляет каждую замену.
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\w+)\\s(\\w+)")
    fmt.Println(re.ReplaceAllString("Ada Lovelace", "$2, $1"))
}

Часто задаваемые вопросы

Урок «Замена текста» бесплатный?

Да — полный текст урока «Замена текста» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Замена текста»?

Заменяйте по шаблонам ReplaceAll Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Замена текста»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы regexp
  2. Поиск и извлечение
  3. Замена текста
  4. Советы по производительности
← Назад к Go Academy