0Pricing
Java Academy · Урок

Замена с помощью регулярных выражений

replaceAll и обратные ссылки

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

Замена с помощью регулярных выражений

Регулярные выражения нужны не только для поиска: с их помощью можно преобразовывать текст. replaceAll заменяет каждое совпадение строкой замены.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1b22c333");
        System.out.println(m.replaceAll("#"));
    }
}

Сокращённый вызов String.replaceAll

String.replaceAll(regex, replacement) — удобная запись в одну строку, которая сама компилирует шаблон.

public class Main {
    public static void main(String[] args) {
        String cleaned = "hello   world  again".replaceAll("\\s+", " ");
        System.out.println(cleaned);
    }
}

replaceFirst

replaceFirst заменяет только первое совпадение, оставляя последующие без изменений.

public class Main {
    public static void main(String[] args) {
        String s = "cat cat cat".replaceFirst("cat", "dog");
        System.out.println(s);
    }
}

Ссылки на группы в заменах

В строке замены $1, $2 и другие подобные обозначения вставляют текст, захваченный соответствующими группами. Это позволяет переставлять или изменять формат совпавшего содержимого.

public class Main {
    public static void main(String[] args) {
        String iso = "30/05/2026".replaceAll("(\\d{2})/(\\d{2})/(\\d{4})", "$3-$2-$1");
        System.out.println(iso);
    }
}

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

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

public class Main {
    public static void main(String[] args) {
        String r = "alice@example.com"
            .replaceAll("(?<user>\\w+)@(?<host>[\\w.]+)", "${user} at ${host}");
        System.out.println(r);
    }
}

Экранирование знака доллара и обратной косой черты

Поскольку $ и \ имеют особое значение в заменах, экранируйте буквальный знак доллара как \$. Matcher.quoteReplacement сделает это за вас.

import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        String price = "100".replaceAll("\\d+", Matcher.quoteReplacement("$100"));
        System.out.println(price);
    }
}

Вычисляемые замены с помощью функции replaceAll

Начиная с Java 9, Matcher.replaceAll может принимать функцию, позволяя вычислять замену для каждого совпадения.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1 b2 c3");
        String out = m.replaceAll(mr -> String.valueOf(Integer.parseInt(mr.group()) * 10));
        System.out.println(out);
    }
}

Перевод совпавших слов в верхний регистр

Форма с функцией особенно полезна, когда замена зависит от совпавшего текста, например при переводе каждого слова в верхний регистр.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\b\\w").matcher("hello there world");
        String title = m.replaceAll(mr -> mr.group().toUpperCase());
        System.out.println(title);
    }
}

appendReplacement и appendTail

Для полного контроля выполняйте find в цикле и создавайте результат с помощью appendReplacement, а затем appendTail. Это классический низкоуровневый подход.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1b2");
        StringBuilder sb = new StringBuilder();
        while (m.find()) {
            m.appendReplacement(sb, "[" + m.group() + "]");
        }
        m.appendTail(sb);
        System.out.println(sb);
    }
}

Обратные ссылки в шаблоне

Обратные ссылки в шаблоне (\1) сопоставляются с повторяющимся текстом и полезны, например, для удаления удвоенных слов при замене.

public class Main {
    public static void main(String[] args) {
        String fixed = "the the end end".replaceAll("\\b(\\w+) \\1\\b", "$1");
        System.out.println(fixed);
    }
}

Удаление ненужных символов

Распространённый вариант применения — очистка входных данных: всё, что не входит в разрешённый набор, заменяется пустой строкой.

public class Main {
    public static void main(String[] args) {
        String digits = "(555) 123-4567".replaceAll("[^0-9]", "");
        System.out.println(digits);
    }
}

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

Что означает $2 в строке замены для replaceAll?

Повторение

Вы преобразовывали текст с помощью регулярных выражений:

  • replaceAll и replaceFirst заменяют совпадения; у String есть сокращённые варианты.
  • $1 / ${name} вставляют захваченные группы в замены; буквальный $ экранируйте как \$ или с помощью quoteReplacement.
  • Форма replaceAll с функцией вычисляет замену для каждого совпадения.
  • appendReplacement + appendTail предоставляют полный ручной контроль.

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

Урок «Замена с помощью регулярных выражений» бесплатный?

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

Чему я научусь в уроке «Замена с помощью регулярных выражений»?

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

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

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

Сколько времени занимает урок «Замена с помощью регулярных выражений»?

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

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

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

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

  1. Компиляция шаблонов
  2. Поиск и сопоставление
  3. Захватывающие группы
  4. Замена с помощью регулярных выражений
← Назад к Java Academy