Avatar ·

Удаление пробелов из строки в Java: как убрать все пробелы и табуляции?

Всем привет! Я новичок в Java и пишу небольшое приложение для обработки пользовательского ввода. Мне нужно удалить все пробелы, табуляции и другие пробельные символы из строки, чтобы получить "чистую" последовательность символов. Проблема в том, что я не могу найти правильный способ. Пробовал метод `trim()`, но он убирает пробелы только в начале и в конце строки. Например: ```java String input = " Привет, мир! "; String trimmed = input.trim(); System.out.println("'" + trimmed + "'"); // Вывод: 'Привет, мир!' — пробелы внутри остались! ``` Мне же нужно, чтобы строка превратилась в `"Привет,мир!"`. Пробовал использовать `replaceAll(" ", "")`, но это удаляет только обычные пробелы (код 32), а если внутри есть табуляция (`\t`) или неразрывные пробелы? Они остаются. Подскажите, пожалуйста, как правильно удалить все пробельные символы (пробелы, табуляции, переводы строк и т.д.) из строки в Java? Есть ли универсальный метод или регулярное выражение? Заранее спасибо! <<>>

Использование регулярного выражения с replaceAll()

Самый надёжный и универсальный способ удалить все пробельные символы в Java — использовать метод String.replaceAll() с регулярным выражением \\s. Класс \\s в Java соответствует любому пробельному символу, включая:

  • Обычный пробел (' ')
  • Табуляцию ('\t')
  • Перевод строки ('\n')
  • Возврат каретки ('\r')
  • Перевод страницы ('\f')
  • Неразрывный пробел и другие Unicode-пробелы

Пример кода:

public class RemoveWhitespace {
    public static void main(String[] args) {
        String input = "   Привет,   мир!\n\tТестовая\tстрока.  ";
        String result = input.replaceAll("\\s", "");
        System.out.println("Результат: '" + result + "'");
        // Вывод: Результат: 'Привет,мир!Тестоваястрока.'
    }
}

Как это работает

Метод replaceAll() принимает два аргумента: регулярное выражение (первый параметр) и строку замены (второй параметр). В нашем случае:

  • \\s — это регулярное выражение, которое означает «любой пробельный символ» (двойной обратный слеш нужен для экранирования в Java-строке).
  • "" — пустая строка, то есть мы заменяем каждый пробельный символ на пустоту (удаляем его).

Альтернативные подходы

Если вы работаете с Java 11 или новее, можно использовать метод String.strip() — но он удаляет пробелы только по краям, как trim(), и не подходит для вашей задачи.

Также есть вариант с StringTokenizer или Scanner, но они менее производительны и удобны:

// Старый способ через StringTokenizer (не рекомендуется)
String input = "a b c";
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(input);
while (st.hasMoreTokens()) {
    sb.append(st.nextToken());
}
System.out.println(sb.toString()); // "abc"

Важное замечание про производительность

Метод replaceAll() каждый раз компилирует регулярное выражение, что может быть медленно при частых вызовах. Если вы удаляете пробелы в цикле (например, обрабатываете миллионы строк), лучше один раз создать объект Pattern и использовать его:

import java.util.regex.Pattern;

public class FastRemoveWhitespace {
    private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s");

    public static String removeWhitespace(String input) {
        return WHITESPACE_PATTERN.matcher(input).replaceAll("");
    }

    public static void main(String[] args) {
        String input = "   Привет,   мир!   ";
        System.out.println(removeWhitespace(input)); // "Привет,мир!"
    }
}

Проверка на null

Не забывайте проверять строку на null, иначе получите NullPointerException:

public static String safeRemoveWhitespace(String input) {
    return (input == null) ? null : input.replaceAll("\\s", "");
}
<<>>

Использование Apache Commons Lang (StringUtils)

Если в вашем проекте уже используется библиотека Apache Commons Lang (или вы готовы её подключить), задача решается одной строкой через StringUtils.deleteWhitespace():

import org.apache.commons.lang3.StringUtils;

public class RemoveWhitespaceCommons {
    public static void main(String[] args) {
        String input = "   Привет,   мир!\nТест\tстрока.  ";
        String result = StringUtils.deleteWhitespace(input);
        System.out.println(result); // "Привет,мир!Тестстрока."
    }
}

Этот метод делает то же самое, что и replaceAll("\\s", ""), но:

  • Работает с null без исключений (возвращает null).
  • Не требует явного создания Pattern — библиотека уже оптимизирована.
  • Код становится более читаемым и самодокументируемым.

Для подключения добавьте в Maven:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

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