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

Дана следующая строка:

String s ="12/15|22:58:25|B|99.502||||A|100.501|||||";

я звоню

int len = s.split("\\|").length;

В любом случае длина 9, а не 13, как должно быть.

Тем не менее, если я изменю указанную строку следующим образом:

String s ="12/15|22:58:25|B|99.502||||A|100.501|||lol||";

Длина 13! Почему? Просто кажется, что Java делает какую-то оптимизацию, которая не требуется, так как эти части строки могут быть заполнены в каком-то другом контексте...

1 ответ

Решение

По умолчанию split удаляет пустые завершающие строки из массива результатов. Чтобы отключить этот механизм, используйте split(regex, limit) с отрицательным пределом, как

split("\\|",-1)

Немного подробнее:
split(regex) внутренне возвращает результат split(regex, 0) и в документации этого метода вы можете найти (выделение мое)

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

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

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

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

Другие вопросы по тегам