Monthly Archives: Май 2015

Правильная разбивка строки функцией split (Java)

Часто при парсинге данных мы разбиваем строку по разделителю. Один из способов — это использование функции split(regex), где regex — это регулярное выражение. Разобъем следующую строку на части:

Java World|0123456|false

Очень часто разделителем выступает вертикальная черта |, т.к. в функция split принимает регулярное выражение, а символ | (pipe) используется в регулярных выражениях для задания условия «или», то этот символ нужно экранировать. Разбить строку можно следующим кодом:

"Java World|0123456|false".split("\\|")

На первый взгляд кажется, что все будет работать без проблем. Возможно, это будет и так, но допустим вам попадется строка, в которой разделитель стоит в конце строки:

Java World|0123456|

Если разбить эту строку:

"Java World|0123456|".split("\\|")

Вы в своем коде можете ожидать массив из трех элементов: «Java World», «0123456», «».
Но массив будет содержать два элемента: «Java World», «0123456», потому что разделитель, стоящий в конце строки игнорируется.
Для того, чтобы последний разделитель не игнорировался нужно в функцию split, передать вторым параметром -1.
У split есть еще одна сигнатура вида: split(regex,limit), где параметр limit означает максимальное кол-во элементов в итоговом массиве. Примеры использования:

"Java World|0123456|".split("\\|",1)
//вернет одну строку, игнорируя разделители: "Java World|0123456|"
"Java World|0123456|".split("\\|",2)
//вернет две строки, игнорируя все разделители, кроме первого: "Java World", "0123456|"
"Java World|0123456|".split("\\|",5)
//вернет три строки - максимально возможное разбиение строки,
//хотя мы пытались разбить строку на 5 частей: "Java World", "0123456", ""

На самом деле метод split(regex) вызывает split(regex,0), т.е. limit равен 0, и функция ведет себя так, как описано в начале статьи.
Если передать параметр limit, равный -1 (или любое отрицательное число), то разделитель в конце строки не игнорируется:

"Java World|0123456|".split("\\|",-1)
//вернет три строки: "Java World", "0123456" и ""

Заключение:
На практике очень часто приходится пользоваться split(regex), но не нужно забывать и про split(regex,-1).
Что касается использования split(regex,limit) при limit > 0, то я не представляю, где это может пригодиться, и, думаю, используется это очень редко.