Как найти совпадения по регулярному выражению
Короткий ответ
Скомпилируйте шаблон в Pattern, создайте Matcher для текста и вызывайте find():
void main() {
Matcher matcher = Pattern.compile("#\\w+").matcher("Learning #java and #regex today");
while (matcher.find()) {
IO.println(matcher.group());
}
}Результат:
#java
#regexГруппы
Скобки создают группы — части совпадения, которые можно достать по номеру:
void main() {
Matcher matcher = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("Due: 2026-03-15");
if (matcher.find()) {
IO.println("year " + matcher.group(1) + ", month " + matcher.group(2));
}
}Результат:
year 2026, month 03Именованные группы
Имя группы (?<name>...) делает код понятнее, чем номера:
void main() {
var pattern = Pattern.compile("(?<key>\\w+)=(?<value>\\w+)");
pattern.matcher("host=localhost port=8080").results()
.forEach(m -> IO.println(m.group("key") + " -> " + m.group("value")));
}Результат:
host -> localhost
port -> 8080results() возвращает объекты MatchResult. Группы по имени они поддерживают начиная с Java 20.
Замена с группами
В строке замены $1, $2 ссылаются на группы:
void main() {
IO.println("2026-03-15".replaceAll("(\\d{4})-(\\d{2})-(\\d{2})", "$3.$2.$1"));
}Результат:
15.03.2026Частая ошибка
Использовать matches() для поиска части текста. matches() требует совпадения со всей строкой, а для поиска внутри нужен find():
void main() {
Matcher matcher = Pattern.compile("\\d+").matcher("room 42");
IO.println(matcher.matches());
IO.println(matcher.reset().find());
}Результат:
false
trueФункции из этого ответа
- Pattern.compile() — Компилирует регулярное выражение в объект Pattern, который можно использовать много раз.
- Matcher.find() — Ищет следующее совпадение шаблона в любом месте строки.
- String.matches() — Проверяет, соответствует ли вся строка регулярному выражению.
- String.replaceAll() — Заменяет все совпадения регулярного выражения.