Подтвердить что ты не робот

Java: String split(): я хочу, чтобы он включал пустые строки в конце

У меня есть следующая строка:

String str = "\nHERE\n\nTHERE\n\nEVERYWHERE\n\n";

Если вы просто напечатаете это, он будет выводиться следующим образом (конечно, \n не будет "буквально" напечатан):

\n
HERE\n
\n
THERE\n
\n
EVERYWHERE\n
\n
\n

Когда я вызываю метод split("\n"), я хочу, чтобы все строки между символами новой строки (\n) даже пустые строки в конце.

Например, если я делаю это сегодня:

String strArray[] = str.split("\n");

System.out.println("strArray.length - " + strArray.length);
for(int i = 0; i < strArray.length; i++)
    System.out.println("strArray[" + i + "] - \"" + strArray[i] + "\"");

Я хочу, чтобы он распечатывался так (Output A):

strArray.length - 8
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"
strArray[6] - ""
strArray[7] - ""

В настоящее время он печатается следующим образом (выход B), и любые конечные пустые строки пропускаются:

strArray.length - 6
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"

Как мне сделать метод split() включать пустые строки, как в Output A? Я, конечно, мог написать многострочный фрагмент кода, но хотел знать, прежде чем тратить время на его реализацию, если бы был простой способ или дополнительные две строки кода, которые могли бы мне помочь. Спасибо!

4b9b3361

Ответ 1

используйте str.split("\n", -1) (с отрицательным аргументом limit). Когда split задан ноль или нет аргумента limit, он отбрасывает завершающие пустые поля, а когда ему присваивается положительный аргумент limit, он ограничивает количество полей этим числом, но отрицательный предел означает разрешить любое количество полей и не отбрасывать конечные пустые поля. Это описано здесь, и поведение взято из Perl.

Ответ 2

Метод разделения с одним аргументом указан для игнорирования конечных пустых разделителей строк, но версия, которая принимает аргумент "limit", сохраняет их, поэтому одним из вариантов будет использование этой версии с большим лимитом.

String strArray[] = str.split("\n", Integer.MAX_VALUE);

Ответ 3

Лично мне нравится утилита Guava для расщепления:

System.out.println(Iterables.toString(
   Splitter.on('\n').split(input)));

Затем, если вы хотите настроить поведение пустой строки, вы можете сделать это:

System.out.println(Iterables.toString(
   Splitter.on('\n').omitEmptyStrings().split(input)));