logo

Очистка строки Java: удаляем нецифровые символы, сохраняем точку

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

Вам срочно требуется решение? Вот оно: для того чтобы очистить строку от всех символов, не являющихся числами, при этом сохранить десятичный разделитель (точку), примените метод String.replaceAll() в Java со следующим регулярным выражением "[^\\d.]+".

Java
Скопировать код
String sanitized = "abc123.45xyz".replaceAll("[^\\d.]+", "");

Теперь переменная sanitized содержит "чистую" строку "123.45", все символы, не являющиеся числами или десятичным разделителем, из неё удалены.

Извлечение числовых значений

Если вам необходимо извлечь из строки целые числа и числа с плавающей точкой, в вашей арсенале — мощь регулярных выражений:

Java
Скопировать код
String input = "a12.334tyz0.78x";
Pattern pattern = Pattern.compile("(\\d+\\.\\d+)");  // Паттерн для чисел с плавающей точкой
Matcher matcher = pattern.matcher(input);   // Применяем паттерн
StringBuilder result = new StringBuilder();
while (matcher.find()) {
    result.append(matcher.group()).append(" ");  // Добавляем найденные значения
}
// Результат: на выходе строка "12.334 0.78 "

Здесь через регулярные выражения проводится "охота" на числа с плавающей точкой, которые будут "пойманы" и сохранены.

Лучшие практики: руководство по регулярным выражениям

Регулярные выражения — это мощный инструмент для работы с текстом. Итак, несколько советов:

  • Захватывающие группы ( ): применяем с умом, стараемся не усложнять выражение.
  • Негация [^ ] и включение [ ]: идеальные инструменты для точного описания того, что нужно удалить или сохранить.
  • Просмотр вперёд (?= ) и просмотр назад (?<= ): расширенные функции для условных сопоставлений. Используйте с осторожностью и не злоупотребляйте ими.
  • Производительность: оптимизируйте регулярные выражения при работе с большими строками.

Особые случаи

Работа с отрицательными числами

Если требуется сохранить отрицательные числа:

Java
Скопировать код
String sanitized = "abc-123.45xyz".replaceAll("[^-\\d.]+", "");

Такое регулярное выражение позволит вам оставить отрицательные числа, а также цифры и точки.

Сохранение дефисов в числовых значениях

В случае, если числа могут содержать дефисы, примените следующее:

Java
Скопировать код
String sanitized = "abc-123.45xyz".replaceAll("[^\\d.-]+", "");

Дефис может быть воспринят как указатель диапазона, поэтому разместите его на подходящем месте внутри группы символов.

Для тех, кто предпочитает простоту

Если вам регулярные выражения кажутся сложными, есть альтернативный подход с использованием CharMatcher от Google Guava:

Java
Скопировать код
String sanitized = CharMatcher.inRange('0', '9').or(CharMatcher.is('.')).retainFrom("abc123.45xyz");

Этот подход дает вам возможность указать допустимые символы, избегая при этом сложностей.

Важно: возможные сложности и исключения

При работе с replaceAll следует быть внимательным:

  • Ваши данные должны быть корректными и структурированными.
  • Неправильно составленное регулярное выражение может вызвать ошибку PatternSyntaxException. Подготовьтесь к обработке исключений.

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

Требуемый процесс можно представить как игру в «найди и сохраняй»:

Markdown
Скопировать код
До: [🍇, #, 🍈, &, 1, 🍉, %, 2, ., 3, $, 🍊]
После:  [1, 2, ., 3]

Из начального хаоса эмодзи остаются только нужные символы: 1 2 . 3, все остальные — исключаются

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

  1. Обсуждения и решения по вопросу удаления из строки нечисловых символов на Stack Overflow.
  2. Официальная документация Java по классу Pattern.
  3. Учебник Oracle по созданию регулярных выражений в Java.
  4. Документация по классу NumberFormat.
  5. Документация по классу DecimalFormat.
  6. Руководство по использованию метода replaceAll() на javatpoint.
  7. Проверка строки на возможность преобразования в тип double на Stack Overflow.