Я видел много вопросов и ответов в Интернете, но, похоже, не могу найти тот случай, который у меня есть.
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", "", "", "", ""};
Возможно ли это с помощью любого встроенного метода или регулярного выражения? Спасибо!
s.split("\\R", -1);
посмотрите на этот вопрос: Разделение Java String удалило пустые значения
@Matjaz проверьте javadoc: «Если предел равен нулю, то шаблон будет применен столько раз, сколько возможно, массив может иметь любую длину, а конечные пустые строки будут отброшены».
Кстати, желаемый результат неверен: вы определили четыре пустые строки, тогда как их должно быть три. Таким образом, ответа модуля @BIBOO должно быть достаточно.
@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 пустых строк может быть правильным, потому что после того, как последний символ новой строки является пустой строкой, тогда конец строки
String[] s = {"a", "b", "", "c", "", "", "", ""}; Нет, было бы String[] s = {"a", "b", "", "c", "", "", ""};
Посмотрите, что происходит, например. до первого a
. Самый простой способ получить это: s.lines().toArray();
Результат: Object[7] { "a", "b", "", "c", "", "", "" }
(JShell)
У этого 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.
Итак, в конце концов, не будет ли правильность зависеть от того, чего хочет ОП, а не от того, что мы считаем правильным?
У этого API есть побочное примечание: это стоит отметить, но здесь оно, похоже, не имеет значения.
Вам придется использовать метод 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 пустые строки, как я и ожидал.
Я не уверен, что предел (второй аргумент в методе разделения) поможет в этом. Это просто ограничивает количество элементов в результате. Это очень простой случай, потому что я работаю с гораздо большими строками, иногда в конце которых появляются новые строки, и мне приходится их правильно обрабатывать.