Как разбить строку на части в Java? Использование split()
Правильное использование метода split() в Java
Метод split() в Java — это мощный инструмент для разбиения строк, но он требует понимания регулярных выражений (regex). Давайте разберём основные моменты.
Почему не работает с точкой?
Проблема в том, что split() принимает регулярное выражение, а не просто строку-разделитель. Символ . в регулярных выражениях означает "любой символ". Поэтому "Привет.Мир".split(".") разбивает строку по каждому символу, и результат — пустой массив (так как все символы удаляются).
Чтобы разбить по точке, нужно экранировать её или использовать класс символов:
String[] parts = "Привет.Мир".split("\\."); // экранирование
// или
String[] parts = "Привет.Мир".split("[.]"); // класс символов
Базовый пример с разделителем-запятой
String data = "яблоко,банан,апельсин,груша";
String[] fruits = data.split(",");
// Результат: ["яблоко", "банан", "апельсин", "груша"]
Обработка нескольких разделителей подряд
По умолчанию split() удаляет пустые строки в конце, но в середине оставляет их. Пример:
String data = "a,,b,c";
String[] parts = data.split(",");
// Результат: ["a", "", "b", "c"]
Если нужно удалить пустые строки полностью, используйте перегрузку с лимитом:
String[] parts = data.split(",", -1); // сохранить все пустые строки
String[] parts = data.split(",", 0); // удалить пустые строки в конце (по умолчанию)
Разбиение по нескольким разделителям
Используйте символ | (ИЛИ) в регулярном выражении:
String data = "яблоко,банан;апельсин груша";
String[] fruits = data.split("[,;\\s]+");
// Результат: ["яблоко", "банан", "апельсин", "груша"]
Здесь [,;\\s]+ означает: один или более символов из набора: запятая, точка с запятой или пробельный символ.
Ограничение количества частей
Метод имеет перегрузку split(String regex, int limit):
- limit > 0: массив будет содержать не более limit элементов, последний элемент будет содержать остаток строки.
- limit = 0: пустые строки в конце удаляются (поведение по умолчанию).
- limit < 0: все пустые строки сохраняются.
String data = "a,b,c,d";
String[] parts = data.split(",", 3);
// Результат: ["a", "b", "c,d"]
Работа с пробелами и лишними символами
Часто нужно разбить строку, игнорируя лишние пробелы вокруг разделителя:
String data = " яблоко , банан , апельсин ";
String[] fruits = data.trim().split("\\s*,\\s*");
// Результат: ["яблоко", "банан", "апельсин"]
Здесь \\s* означает ноль или более пробельных символов.
Альтернативы split()
Если вам не нужны регулярные выражения, можно использовать:
StringTokenizer(устаревший, но простой):
StringTokenizer st = new StringTokenizer("яблоко,банан", ",");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
Pattern.compile() для сложных регулярных выражений (лучше производительность при многократном использовании):Pattern pattern = Pattern.compile(",");
String[] fruits = pattern.split("яблоко,банан,апельсин");
Главное запомните: аргумент split() — это регулярное выражение. Экранируйте специальные символы (., |, *, +, ?, ^, $, {, }, (, ), [, ], \\) с помощью двойного обратного слеша (\\).
Использование Guava или Apache Commons для разбиения строк
Если вы работаете над проектом, где уже используются библиотеки Google Guava или Apache Commons Lang, можно воспользоваться их удобными утилитами.
Google Guava — Splitter
import com.google.common.base.Splitter;
String data = "яблоко, банан, апельсин";
Iterable<String> fruits = Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(data);
// Результат: ["яблоко", "банан", "апельсин"]
Splitter возвращает Iterable, который можно легко преобразовать в список:
List<String> list = Splitter.on(',').splitToList(data);
Apache Commons Lang — StringUtils
import org.apache.commons.lang3.StringUtils;
String data = "яблоко,банан,апельсин";
String[] fruits = StringUtils.split(data, ",");
// Результат: ["яблоко", "банан", "апельсин"]
Метод StringUtils.split() не использует регулярные выражения, поэтому не нужно экранировать символы. Он также автоматически удаляет пустые строки.
Эти библиотеки часто более читаемы и безопасны для новичков, так как скрывают сложность регулярных выражений. Однако для простых случаев встроенный split() — лучший выбор, чтобы не добавлять лишние зависимости.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги
Оптимизация производительности TypeScript приложений: лучшие практики