Ответ 1
Рассмотрим расщепленное выражение ",1,2,3,4".split(",");
Чего вы ожидаете? Правильно, пустая строка для начала. В вашем случае у вас есть "ничего" перед первым "а", а также за ним.
Обновление: комментарии показывают, что этого объяснения недостаточно для объяснения (чего это может быть не так)... но это действительно так просто: двигатель запускается в начале строки, и он смотрит, перед ним соответствует шаблон. Если это так, он присваивает то, что позади, для нового элемента в расколе.
На первом символе у него есть "(ничего позади), и он смотрит, есть ли перед ним" " (шаблон). Существует так, что он создает совпадение.
Затем он движется дальше, и он имеет "а" позади него, и снова он снова имеет "перед ним. Таким образом, вторым результатом является строка" a".
Интересное замечание состоит в том, что если вы используете split("", -1)
, вы также получите результат с пустой строкой в последней позиции массива результатов.
Отредактируйте 2: Если я еще больше размахиваю мозгами и считаю это академическим упражнением (я бы не рекомендовал это в реальной жизни...) Я могу представить только один хороший способ сделать регулярное выражение split()
of a String в массив String[]
с 1 символом в каждой строке (в отличие от char [] - который другие люди дали отличные ответы для....).
String[] chars = str.split("(?<=.)", str.length());
Это будет выглядеть позади каждого символа в группе, не связанной с захватом, и разделить на нее, а затем ограничить размер массива количеством символов (вы можете оставить str.length()
out, но если вы поместите -1
вы получите дополнительное пространство в конце)
Заимствуя альтернативу nitro2k01 (ниже в комментариях), которая ссылается на начало и конец строки, вы можете надежно разделить на:
String[] chars = str.split("(?!(^|$))");