Извлечение чисел из строки в Java: использование regex
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для извлечения значений с помощью регулярных выражений в Java используются классы Pattern
и Matcher
. Представим пример кода, который демонстрирует решение подобной задачи:
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+).*
:
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+).*
:
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+
поможет вам найти последовательности цифр.
Визуализация
Можно представить регулярные выражения как фонарик 🔦, освещающий путь через плотный заросли текста (🌳📜🌳) к скрытым ценностям данных (💎):
Текстовые заросли (🌳📜🌳): "Секретный код ABC123. Берегите его."
Фонарик (🔦): "код (\\w+)" // Освещаем непроходимые места
Осветив путь, находим драгоценный камень:
Pattern pattern = Pattern.compile("код (\\w+)");
Matcher matcher = pattern.matcher("Секретный код ABC123. Берегите его.");
if (matcher.find()) {
System.out.println("Сокровище найдено: " + matcher.group(1)); // 💎 Выводим 'ABC123'
}
И вуаля — вы обрели своё сокровенное значение.
Сокровище найдено: 💎 ABC123
Станьте мастером регулярных выражений
1. Овладение сложными шаблонами
Если необходимо бороться со сложными строками, используйте группировку ()
и альтернативу |
:
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
для работы с многострочными текстами. Это позволит изменить поведение символов ^
и $
:
Pattern pattern = Pattern.compile("^Ошибка: (.+)$", Pattern.MULTILINE);
Matcher matcher = pattern.matcher("Первая строка\nОшибка: Катастрофический сбой\nПоследняя строка");
while (matcher.find()) {
System.out.println("Каждая ошибка: " + matcher.group(1)); // находим все ошибки в тексте
}
3. Улучшение читаемости и удобства работы с кодом
Дайте имена вашим группам для улучшения читаемости кода и поддержки его в будущем:
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"
}