Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как найти совпадения по регулярному выражению

Короткий ответ

Скомпилируйте шаблон в 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 -> 8080

results() возвращает объекты 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() — Заменяет все совпадения регулярного выражения.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.