Как извлечь числа из строки
Короткий ответ
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.