Encodera

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

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

Как извлечь числа из строки

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

Pattern описывает, что искать, а results() возвращает поток всех совпадений:

void main() {
    String text = "Order 15 contains 3 items for 120 euros";
 
    List<Integer> numbers = Pattern.compile("\\d+").matcher(text).results()
            .map(match -> Integer.parseInt(match.group()))
            .toList();
    IO.println(numbers);
}

Результат:

[15, 3, 120]

Через цикл find()

Классический способ — вызывать find(), пока совпадения не кончатся:

void main() {
    Matcher matcher = Pattern.compile("\\d+").matcher("a1b22c333");
    while (matcher.find()) {
        IO.println(matcher.group() + " at " + matcher.start());
    }
}

Результат:

1 at 1
22 at 3
333 at 6

Дробные и отрицательные

Расширьте выражение необязательным минусом и дробной частью:

void main() {
    String text = "t = -3.5, then 12 and 0.75";
 
    var numbers = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(text).results()
            .map(match -> Double.parseDouble(match.group()))
            .toList();
    IO.println(numbers);
}

Результат:

[-3.5, 12.0, 0.75]

Только цифры подряд

Если нужно получить все цифры одной строкой, удалите всё остальное:

void main() {
    IO.println("+1 (555) 010-99".replaceAll("\\D", ""));
}

Результат:

155501099

Частая ошибка

Вызвать group() без успешного find(). Matcher ещё не нашёл совпадение и выбрасывает исключение:

void main() {
    Matcher matcher = Pattern.compile("\\d+").matcher("abc 42");
    IO.println(matcher.group());
}

Результат:

Exception in thread "main" java.lang.IllegalStateException: No match found

Функции из этого ответа

  • Pattern.compile() — Компилирует регулярное выражение в объект Pattern, который можно использовать много раз.
  • Matcher.find() — Ищет следующее совпадение шаблона в любом месте строки.
  • String.replaceAll() — Заменяет все совпадения регулярного выражения.
  • Integer.parseInt() — Превращает строку с целым числом в int.

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

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