Как можно разбить строку, содержащую только разделитель?

Я использую следующий код:

String sample = "::";
String[] splitTime = sample.split(":");
// extra detail omitted
System.out.println("Value 1 :"+splitTime[0]);
System.out.println("Value 2 :"+splitTime[1]);
System.out.println("Value 3 :"+splitTime[2]);

Я получаю исключение ArrayIndexOutofBound. Как String.split() обрабатывать последовательные или конечные/открывающие разделители?

См. также:

Ответы

Ответ 1

Alnitak верен, что по умолчанию пустые строки будут отброшены.

Если вы хотите иметь завершающие пустые строки, вы должны использовать split(String, int) и передать отрицательное число в качестве параметра limit.

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

Обратите внимание, что split(aString) является синонимом split(aString, 0):

Этот метод работает, как если бы он вызвал метод с двумя аргументами split с данным выражением и предельным аргументом нуля. Поэтому конечные пустые строки не включаются в результирующий массив.

Кроме того, вы должны использовать цикл для получения значений из массива; это позволяет избежать возможного ArrayIndexOutOfBoundsException.

Итак, ваш исправленный код должен быть (при условии, что вы хотите иметь завершающие пустые строки):

String sample = "::";
String[] splitTime = sample.split(":", -1);
for (int i = 0; i < splitTime.length; i++) {
    System.out.println("Value " + i + " : \"" + splitTime[i] + "\"");
}

Вывод:

Value 0 : ""
Value 1 : ""
Value 2 : ""

Ответ 2

Из руководства J2SE API:

Таким образом, конечные пустые строки не включаются в результирующий массив.

Итак, если вы перейдете в "::", вы получите пустой массив, потому что все разделители заканчиваются.

Если вы хотите убедиться, что вы получаете не более трех записей, вы должны использовать:

String[] splitTime = sample.split(":", 3);

При вводе "::", который действительно даст вам три пустые строки в выходном массиве.

Однако, если вход только имеет один ":", тогда вы все равно получите только два элемента в своем массиве.

Ответ 3

Как это возможно?

int ndx = 0;
StringTokenizer t = new StringTokenizer(": : ::::",":");
while (t.hasMoreElements())
{
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement()));
}

Ответ 4

Используйте функцию StringTokenizer, в которой u передает строку, а второй аргумент - как разделитель

используйте функцию splittime.length, чтобы найти длину

Ответ 5

вы должны проверить длину массива splitTime.