Groovy: Почему функция split() пустой строки по пробелу возвращает список из одной пустой строки?

Я ожидал пустой список, но я получил:

assert 1 == "".split(/\s+/).size()

а также

assert 0 == "".split().size()


person Alexander Suraphel    schedule 03.11.2014    source источник
comment
Я думаю, это ошибка. Я попрошу остальных членов команды внести свой вклад.   -  person Jeff Scott Brown    schedule 03.11.2014
comment
Я думаю, что Java делает то же самое.   -  person Jeff Scott Brown    schedule 03.11.2014
comment
@JeffScottBrown Я только что узнал, что это стандартное поведение. оформить заказ stackoverflow.com/questions/16645083/   -  person Alexander Suraphel    schedule 03.11.2014
comment
Я думаю, что люди могут спорить о том, является ли это ошибкой. Это не всегда так, но в данном конкретном случае я думаю, что совместимость с Java, вероятно, имеет больше смысла, чем изменение этого.   -  person Jeff Scott Brown    schedule 03.11.2014
comment
@JeffScottBrown, верно! Кажется, для такого поведения есть веская причина.   -  person Alexander Suraphel    schedule 03.11.2014


Ответы (2)


Может быть, вам следует использовать tokenize() вместо этого?

assert "".tokenize().size() == 0
assert "foo bar".tokenize() == ['foo', 'bar']
person Dónal    schedule 03.11.2014

Я только что узнал, что Java и Python String.split() также следуют этому шаблону. Оформить заказ http://docs.python.org/2/library/stdtypes.html#str.split.

Вопрос SO Когда разбивая пустую строку в Python, почему split() возвращает пустой список, а split('\n') возвращает ['']? также содержит обязательные для чтения ответы.

Ответ с наибольшим количеством голосов объясняет:

str.split() метод имеет два алгоритма. Если аргументы не указаны, он разбивается на повторяющиеся прогоны пробелов. Однако, если указан аргумент, он обрабатывается как один разделитель без повторных запусков.

В случае разбиения пустой строки первый режим (без аргумента) вернет пустой список, потому что пробелы съедены и нет значений, которые можно было бы поместить в список результатов.

Напротив, второй режим (с таким аргументом, как \n) создаст первое пустое поле. Учтите, что если бы вы написали '\n'.split('\n'), вы бы получили два поля (одно разбиение дает вам две половины).

person Alexander Suraphel    schedule 03.11.2014