Давайте разберем каждый из этих вызовов до String#split(String)
. Из документации Java следует заметить, что «метод работает так, как если бы он вызывал метод разбиения с двумя аргументами с заданным выражением и нулевым аргументом предельного значения. Поэтому в результирующие пустые строки не включаются массив. "
"abcde".split("[a-z]"); // => []
Этот соответствует каждому символу (a, b, c, d, e) и приводит только к пустым строкам между ними, которые опущены.
"abcde".split("\\w")); // => []
Опять же, каждый символ в строке является символом слова (\w
), поэтому результатом являются пустые строки, которые опускаются.
"abcde".split("\\w*?")); // => ["", "a", "b", "c", "d", "e"]
В этом случае *
означает «ноль или более предыдущего элемента» (\w
), что соответствует пустому выражению семь раз (один раз в начале строки, затем один раз между каждым символом). Таким образом, мы получаем первую пустую строку, затем каждый символ.
"abcde".split("\\w+?")); // => []
Здесь +
означает «один или несколько из предыдущего элемента» (\w
), который соответствует всей входной строке, в результате чего получается только пустая строка, которая опускается.
Попробуйте эти примеры еще раз с input.split(regex, -1)
, и вы должны увидеть все пустые строки.