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