Строка Java, разделенная пустыми строками, включая пустые строки в конце

Я видел много вопросов и ответов в Интернете, но, похоже, не могу найти тот случай, который у меня есть.

String s = "a\nb\n\nc\n\n\n\n";
String[] split = s.split("\\R");
//is the same as this
String[] splitResult = {"a", "b", "", "c"};

Но я бы хотел, чтобы результат включал элементы массива, находящиеся в конце, где есть только новые строки. Что-то вроде этого:

String[] s = {"a", "b", "", "c", "", "", "", ""};

Возможно ли это с помощью любого встроенного метода или регулярного выражения? Спасибо!

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

Matjaz 19.07.2024 10:52

s.split("\\R", -1);

Asmir 19.07.2024 10:53

посмотрите на этот вопрос: Разделение Java String удалило пустые значения

DuesserBaest 19.07.2024 10:58

@Matjaz проверьте javadoc: «Если предел равен нулю, то шаблон будет применен столько раз, сколько возможно, массив может иметь любую длину, а конечные пустые строки будут отброшены».

user85421 19.07.2024 10:58

Кстати, желаемый результат неверен: вы определили четыре пустые строки, тогда как их должно быть три. Таким образом, ответа модуля @BIBOO должно быть достаточно.

maio290 19.07.2024 10:58

@maio290 maio290 Я еще раз пошел перепроверить. В документации говорится: "The array returned by this method contains each substring of this string that is terminated by another substring that matches the given expression or is terminated by the end of the string" Я думаю, что возврат 4 пустых строк может быть правильным, потому что после того, как последний символ новой строки является пустой строкой, тогда конец строки

BIBOO unit 19.07.2024 11:20

String[] s = {"a", "b", "", "c", "", "", "", ""}; Нет, было бы String[] s = {"a", "b", "", "c", "", "", ""}; Посмотрите, что происходит, например. до первого a. Самый простой способ получить это: s.lines().toArray(); Результат: Object[7] { "a", "b", "", "c", "", "", "" } (JShell)

g00se 19.07.2024 11:27

У этого API есть примечание: This definition of line implies that an empty string has zero lines and that there is no empty line following a line terminator at the end of a string. Итак, в конце концов, не будет ли правильность зависеть от того, чего хочет ОП, а не от того, что мы считаем правильным?

BIBOO unit 19.07.2024 11:45

У этого API есть побочное примечание: это стоит отметить, но здесь оно, похоже, не имеет значения.

g00se 19.07.2024 11:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
9
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам придется использовать метод Split() с двумя аргументами класса String. Хотя вы упомянули, что это ограничивает количество результатов, вы упустили из виду следующее:

предел > 0 – если это так, то шаблон будет применен при в большинстве случаев limit-1 длина результирующего массива не будет превышать n, и последняя запись результирующего массива будет содержать все входные данные за пределами последний совпавший шаблон.

предел < 0 – в этом случае шаблон будет применен столько раз, сколько возможно, и результирующий массив может иметь любой размер.

limit = 0 – в этом случае паттерн будет применен столько раз, сколько возможно, результирующий массив может иметь любой размер и заканчиваться пустым строки будут отброшены.

Я протестировал следующее:

public static void main(String[] args) {
    String s = "a\nb\n\nc\n\n\n\n";
    String[] split = s.split("\\R", -1);
    System.out.println(Arrays.toString(split));
}

Даю мне результат:

[а, б, , в, , , , ]

Я просмотрел реализацию, но как-то пропустил -1. Большое вам за это спасибо! В конце концов оказалось, что в конце было 4 пустые строки, как я и ожидал.

Matjaz 19.07.2024 15:25

Другие вопросы по теме

Похожие вопросы

Блокировать утилиту GetMapping для получения сообщения от Redis при загрузке Spring
Пытаюсь запустить сервер Minecraft и постоянно получаю сообщение об ошибке: невозможно получить доступ к jarfile
Spring Cloud Gateway с клиентом обнаружения Kubernetes для запросов http и grpc
Невозможно создать массив функций в Java 8
Понимание порядка выполнения с помощью .then(Mono{})
Изменение часового пояса не приводит к тому, что LocalTime.now() возвращает другое значение, почему?
Может ли один и тот же код, использующий HttpClient, скомпилироваться с Spring-5.x и 6.x?
Улучшите качество подписи, извлеченной с помощью OpenCV из отсканированного листа бумаги
Переверните последовательные нули в единицы за k операций, чтобы получить максимальное количество единиц, найдите максимальное количество единиц
Влияет ли расстояние между операторами, отступами и комментариями в коде на его временную и пространственную сложность?