Не уверен, как на самом деле работает разбиение строк в этом случае - PullRequest
16 голосов
/ 15 февраля 2012

Я не получаю следующее:

В следующих String:

String s = "1234;x;;y;";

, если я делаю:
String[] s2 = s.split(";");

Я получаю s2.length равным 4 и

s2[0] = "1234";  
s2[1] = "x";  
s2[2] = "";  
s2[3] = "y"; 

Но в строке: String s = "1234;x;y;;";

Я получаю:

s2.length добыть 3 и

s2[0] = "1234";  
s2[1] = "x";  
s2[2] = "y"; 

?

В чем разница, и я не получаю 4 в последнем случае?

ОБНОВЛЕНИЕ:
Использование -1 не было, как я ожидал, как поведение.
Я имею в виду, что последняя точка с запятой - это конец String, поэтому в последнемпример я также ожидал 4 как длина массива

Ответы [ 6 ]

10 голосов
/ 15 февраля 2012

Из документов ,

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

ОБНОВЛЕНИЕ:

У вас есть пять подстрок, разделенных ; Во втором случае эти1234, x, y, и .Согласно документам, все пустые подстроки (в конце), которые являются результатом операции разделения, будут удалены.Подробнее смотрите здесь: .

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

Например, строка boo:and:foo дает следующие результаты с этими параметрами:

Regex   Limit   Result
  :       2     { "boo", "and:foo" }
  :       5     { "boo", "and", "foo" }
  :      -2     { "boo", "and", "foo" }
  o       5     { "b", "", ":and:f", "", "" }
  o      -2     { "b", "", ":and:f", "", "" }
  o       0     { "b", "", ":and:f" }   // all the empty substrings at the end were eliminated
4 голосов
/ 15 февраля 2012

Завершающие пустые строки опущены.Однако есть способы включить их явно, если это необходимо.

3 голосов
/ 15 февраля 2012

С http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

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

2 голосов
/ 15 февраля 2012

Хороший вопрос. Если вы посмотрите документацию API для String.split() и посмотрите пример с "boo: foo", то вы увидите, что завершающие пустые строки опущены.

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

Например, строка "boo: and: foo" дает следующие результаты с этими выражениями:

Regex Result

: {"boo", "and", "foo"}

o {"b", "", ": and: f"}

1 голос
/ 15 февраля 2012

Это поведение по умолчанию метода split в Java, чтобы не возвращать пустые токены.]

s.split ("\;", -1);должен вернуть пустой токен

0 голосов
/ 15 февраля 2012

Почему бы не проверить, что говорится в документации в первую очередь.Вот ссылка:

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29

И вот ваш ответ:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...