Извлечение чисел из строки в Java: использование regex

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для извлечения значений с помощью регулярных выражений в Java используются классы Pattern и Matcher. Представим пример кода, который демонстрирует решение подобной задачи:

Java
Скопировать код
Pattern pattern = Pattern.compile("значение: (\\d+)");
Matcher matcher = pattern.matcher("значение: 123");
if (matcher.find()) {
    System.out.println("Извлечено: " + matcher.group(1)); // выводится "123"
}

Обратите внимание, что "(\\d+)" — это именно шаблон, который ищет числовые значения, а matcher.group(1) позволяет получить результат.

Задачи на каждый день: применение регулярных выражений в Java-коде

1. Извлечение первого числа из текста

Чтобы найти и извлечь первую группу цифр из текста, следует использовать выражение ^\\D+(\\d+).*:

Java
Скопировать код
Pattern pattern = Pattern.compile("^\\D+(\\d+).*");
Matcher matcher = pattern.matcher("Товар 123: Описание");
if (matcher.find()) {
    System.out.println("Первое число: " + matcher.group(1)); // получаем "123"
}

2. Работа со знаковыми числами

Если в работе возникают отрицательные числовые значения, например, -123, скорректируйте шаблон до ^\\D+(-?\\d+).*:

Java
Скопировать код
Pattern pattern = Pattern.compile("^\\D+(-?\\d+).*");
Matcher matcher = pattern.matcher("Значение -123, ошибка 404");
if (matcher.find()) {
    System.out.println("Знаковое число: " + matcher.group(1)); // выводим "-123"
}

3. Вопрос производительности

Регулярное выражение следует скомпилировать через Pattern.compile() единожды, а затем многократно использовать для улучшения производительности.

4. Полезные советы

Последовав таким правилам, можно избежать возникновения проблем:

  • Всегда используйте двойное экранирование для обратного слеша (\\) в строковых литералах.
  • Применяйте matcher.find() для поиска и matcher.group() для извлечения необходимых данных.
  • Оператор \\d+ поможет вам найти последовательности цифр.

Визуализация

Можно представить регулярные выражения как фонарик 🔦, освещающий путь через плотный заросли текста (🌳📜🌳) к скрытым ценностям данных (💎):

Markdown
Скопировать код
Текстовые заросли (🌳📜🌳): "Секретный код ABC123. Берегите его."
Фонарик (🔦): "код (\\w+)" // Освещаем непроходимые места

Осветив путь, находим драгоценный камень:

Java
Скопировать код
Pattern pattern = Pattern.compile("код (\\w+)");
Matcher matcher = pattern.matcher("Секретный код ABC123. Берегите его.");
if (matcher.find()) {
    System.out.println("Сокровище найдено: " + matcher.group(1)); // 💎 Выводим 'ABC123'
}

И вуаля — вы обрели своё сокровенное значение.

Markdown
Скопировать код
Сокровище найдено: 💎 ABC123

Станьте мастером регулярных выражений

1. Овладение сложными шаблонами

Если необходимо бороться со сложными строками, используйте группировку () и альтернативу |:

Java
Скопировать код
Pattern pattern = Pattern.compile("ошибка (\\d+)|успех (\\w+)");
Matcher matcher = pattern.matcher("Операция завершена с ошибкой 404 или успехом ОК");
if (matcher.find()) {
    System.out.println("Результат: " + matcher.group(0)); // "ошибка 404" или "успех ОК", что было найдено первым
}

2. Работа с многострочными текстами

Применяйте флаги Pattern.MULTILINE и Pattern.DOTALL для работы с многострочными текстами. Это позволит изменить поведение символов ^ и $:

Java
Скопировать код
Pattern pattern = Pattern.compile("^Ошибка: (.+)$", Pattern.MULTILINE);
Matcher matcher = pattern.matcher("Первая строка\nОшибка: Катастрофический сбой\nПоследняя строка");
while (matcher.find()) {
    System.out.println("Каждая ошибка: " + matcher.group(1)); // находим все ошибки в тексте
}

3. Улучшение читаемости и удобства работы с кодом

Дайте имена вашим группам для улучшения читаемости кода и поддержки его в будущем:

Java
Скопировать код
Pattern pattern = Pattern.compile("состояние: (?<status>\\w+)\\s+код: (?<code>\\d+)");
Matcher matcher = pattern.matcher("состояние: УСПЕХ код: 200");
if (matcher.find()) {
    System.out.println("Состояние: " + matcher.group("status") + ", Код: " + matcher.group("code")); // выводим "Состояние: УСПЕХ, Код: 200"
}

Полезные материалы

  1. Pattern (Java SE 11 & JDK 11 )
  2. Matcher (Java SE 11 & JDK 11 )
  3. Урок по регулярным выражениям (учебник Java)
  4. Тестирование регулярных выражений (учебник Java)
  5. Java Regex (javatpoint)
  6. Java – Регулярные выражения (tutorialspoint)
  7. Регулярные выражения в Java (DigitalOcean)