- Разделите строку в Java и сохраните разделители
- 2. Основы
- 3. Обзорные утверждения
- 4. Использование String.split()
- 4.1. Положительный прогноз
- 4.2. Положительный взгляд назад
- 4.3. Положительный просмотр вперед или просмотр назад
- 5. Использование разделителя гуавы
- 6. Использование Apache Commons StringUtils
- 7. Заключение
- Java split несколько символов
Разделите строку в Java и сохраните разделители
Программисты часто сталкиваются с алгоритмами, включающими разбиение строк. В особом сценарии может потребоваться разделить строку на основе одного или нескольких отдельных разделителей, а также вернуть разделители как часть операции разделения .
Давайте подробно обсудим различные доступные решения этой проблемы разделения строк .
2. Основы
Вселенная Java предлагает довольно много библиотек ( например, java.lang.String , Guava и Apache Commons), облегчающих разбиение строк в простых и довольно сложных случаях. Кроме того, многофункциональные регулярные выражения обеспечивают дополнительную гибкость при разделении задач, связанных с сопоставлением определенного шаблона.
3. Обзорные утверждения
В регулярных выражениях утверждения просмотра указывают, что совпадение возможно либо путем просмотра вперед (просмотр вперед), либо поиска назад (просмотр назад) для другого шаблона в текущем местоположении исходной строки. Давайте лучше поймем это на примере.
Предварительное утверждение Java(?=ForEach) соответствует «Java» , только если за ним следует «ForEach» .
Давайте воспользуемся такими регулярными выражениями с обзорными утверждениями и придумаем решение нашей проблемы.
Во всех примерах, объясненных в этой статье, мы будем использовать два простых String :
String text = "Hello@World@This@Is@A@Java@Program"; String textMixed = "@HelloWorld@This:Is@A#Java#Program";
4. Использование String.split()
Начнем с использования метода split() из класса String основной библиотеки Java.
Кроме того, мы оценим соответствующие утверждения просмотра вперед, утверждения просмотра назад и их комбинации, чтобы разделить строки по желанию.
4.1. Положительный прогноз
Прежде всего, давайте воспользуемся опережающей проверкой «(( ?=@ ))» и разобьем текст строки вокруг его совпадений:
Упреждающее регулярное выражение разбивает строку на прямое совпадение символа «@» . Содержимое результирующего массива:
[Hello, @World, @This, @Is, @A, @Java, @Program]
Использование этого регулярного выражения не возвращает разделители отдельно в массиве splits . Давайте попробуем альтернативный подход.
4.2. Положительный взгляд назад
Мы также можем использовать положительное утверждение обратного просмотра «((?< =@ ))» , чтобы разделить текст строки :
Однако результирующий вывод по-прежнему не будет содержать разделители как отдельные элементы массива:
[Hello@, World@, This@, Is@, A@, Java@, Program]
4.3. Положительный просмотр вперед или просмотр назад
Мы можем использовать комбинацию двух объясненных выше обходов с логическим ИЛИ и увидеть его в действии.
Приведенное выше регулярное выражение разбивает строку, и результирующий массив содержит разделители:
[Hello, @, World, @, This, @, Is, @, A, @, Java, @, Program]
Теперь, когда мы понимаем, что такое регулярное выражение для подтверждения просмотра, мы можем изменить его на основе различных типов разделителей, присутствующих во входной строке.
Давайте попробуем разделить textMixed , как определено ранее, используя подходящее регулярное выражение:
String[] splitsMixed = textMixed.split("((?=:|#|@)|(?<=:|#|@))");
Было бы неудивительно увидеть следующие результаты после выполнения приведенной выше строки кода:
[@, HelloWorld, @, This, :, Is, @, A, #, Java, #, Program]
5. Использование разделителя гуавы
Учитывая, что теперь у нас есть ясность в отношении утверждений регулярных выражений, обсуждавшихся в предыдущем разделе, давайте углубимся в библиотеку Java, предлагаемую Google.
Класс Splitter из Guava предлагает методы on() и onPattern() для разделения строки с использованием шаблона регулярного выражения в качестве разделителя.
Для начала давайте посмотрим, как они работают со строковым текстом , содержащим один разделитель «@» :
ListString> splits = Splitter.onPattern("((?=@)|(?<=@))").splitToList(text); ListString> splits2 = Splitter.on(Pattern.compile("((?=@)|(?<=@))")).splitToList(text);
Результаты выполнения приведенных выше строк кода очень похожи на результаты, сгенерированные методом split , за исключением того, что теперь у нас есть List вместо массивов.
Точно так же мы можем использовать эти методы для разделения строки, содержащей несколько разных разделителей:
ListString> splitsMixed = Splitter.onPattern("((?=:|#|@)|(?<=:|#|@))").splitToList(textMixed); ListString> splitsMixed2 = Splitter.on(Pattern.compile("((?=:|#|@)|(?<=:|#|@))")).splitToList(textMixed);
Как мы видим, разница между двумя вышеуказанными способами весьма заметна.
Метод on() принимает аргумент java.util.regex.Pattern , тогда как метод onPattern() просто принимает регулярное выражение-разделитель как String .
6. Использование Apache Commons StringUtils
Мы также можем воспользоваться методом StringUtils проекта Apache Commons Lang splitByCharacterType().
Очень важно отметить, что этот метод работает, разбивая входную строку по типу символа, возвращаемому java.lang.Character.getType(char) . Здесь мы не можем выбирать или извлекать разделители по нашему выбору. «
Кроме того, он дает наилучшие результаты, когда исходная строка имеет постоянный регистр, либо верхний, либо нижний:
String[] splits = StringUtils.splitByCharacterType("pg@no;10@hello;world@this;is@a#10words;Java#Program");
Различные типы символов, как показано в приведенной выше строке, — это прописные и строчные буквы, цифры и специальные символы (@ ; # ).
Следовательно, результирующий массив разбивается, как и ожидалось, выглядит так:
[pg, @, no, ;, 10, @, hello, ;, world, @, this, ;, is, @, a, #, 10, words, ;, J, ava, #, P, rogram]
7. Заключение
В этой статье мы увидели, как разделить строку таким образом, чтобы разделители также были доступны в результирующем массиве.
Во-первых, мы обсудили контрольные утверждения и использовали их для получения желаемых результатов. Позже мы использовали методы, предоставляемые библиотекой Guava, для достижения аналогичных результатов.
Наконец, мы завершили работу с библиотекой Apache Commons Lang, которая предоставляет более удобный для пользователя метод решения связанной с этим проблемы разбиения строки, а также возврата разделителей.
Как всегда, код, использованный в этой статье, можно найти на GitHub .
Java split несколько символов
если не хотите экранировать или не знаете, надо ли, просто пишите text.split(Pattern.quote(«<нужный знак>«)); Тогда значение всегда будет строковым и не касаться регулярок. Ну и если нет автоимпорта, то не забудьте импортировать java.util.regex.Patternнужный>
Статья класс, можно добавить, что в качестве параметра split принимает и сразу несколько разделителей
String str = "Амо/ре.амо,ре"; String[] words = str.split("[/\\.,]"); // Амо ре амо ре
А если нет разделителей, но есть сплошная строка длиной N символов, и нужно разделить ее, допустим, на число M ? То как в этом случае быть?
Когда я в первый раз прочитал данную статью, ничего не понял и посчитал данную статью бесполезной. А на тот момент я изучал первый месяц. И сейчас, спустя еще 2 месяца я наконец то понял что тут написано) И могу теперь смело сказать что да, статья полезная.
А если в задаче разделитель вводится с клавиатуры, то как добавить\\ чтоб ошибки зарезервированного знака не было?
По-моему, зря ничего не сказано про то, что точка ( «.») не может служить разделителем, в отличие от запятой например. И её надо обозначать слэшами — («\\.»)
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.