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 ноль, тогда шаблон будет применяться как можно дольше, массив может иметь любую длину, а завершающие пустые строки будут отброшены.