2013-05-06 3 views
2

Пример:Почему String.split обрабатывает начальную и конечную часть строки по-другому?

String s = ":a:b:c:"; 
s.split(":"); 
// Output: [, a, b, c] 

От Doc Java:

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.

Почему исходная пустая строка считается, где окончание пустая строка не является? Исходная пустая строка завершается символом «:», а конечная пустая строка завершается в конце строки. Поэтому оба должны быть перечислены, не так ли?

+0

'split' действительно принимает регулярное выражение .. поэтому просто': 'может быть не идеальным в вашем случае – 2013-05-06 17:05:42

ответ

6

Если вы не указали limit, метод split не возвращает завершающие пустые совпадения. Процитировать Javadocs:

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

Если вы используете 2-параметрическую версию split, то передайте отрицательный предел и размер возвращаемого массива не будет ограничен; вы получите завершающие пустые строки.

Если n не является положительным, тогда шаблон будет применяться столько раз, сколько может быть , и массив может иметь любую длину.

Здесь я думаю, что Javadocs имеют в виду limit, когда они говорят n.

0

В этом методе завершающие пустые строки будут отброшены. вы можете получить подробную идею от here

2

Как указано в Javadocs:

Trailing empty strings are therefore not included in the resulting array. 

.split также поддерживает второй параметр (предел), который изменяет поведение по умолчанию, как показано ниже:

String s = ":a:b:c:"; 
s.split(":", 0); //"Default" Split behaviour --> [, a, b, c] 
s.split(":", 1); //Array length == 1 --> [:a:b:c:] 
s.split(":", 2); //Array length == 2 --> [, a:b:c:] 
s.split(":", 3); //Array length == 3 --> [, a, b:c:] 
s.split(":", -1); //Any length. Trailling empty spaces are not ommited --> [, a, b, c, ] 

Как примечание стороны, Google Guava предоставляет множество классов для ускорения разработки на Java, таких как Splitter, которые могут удовлетворить ваши потребности:

private static final Splitter SPLITTER = Splitter.on(':') 
    .trimResults() 
    .omitEmptyStrings(); 

//returns ["a", "b", "c"] 
SPLITTER.split(":a:b::::c:::") 
Смежные вопросы