Замена с помощью регулярных выражений
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 — локальная установка не требуется.
Все уроки этого курса
- Компиляция шаблонов
- Поиск и сопоставление
- Захватывающие группы
- Замена с помощью регулярных выражений