2015-05-22 4 views
5

Скале имеет стандартный способ разделения строки в StringOps.splitразбить строку на полукокса

это поведение несколько удивило меня, хотя.

Чтобы продемонстрировать, используя функцию быстрого удобства

def sp(str: String) = str.split('.').toList 

следующих выражения все оценивают истину

(sp("") == List("")) //expected 
(sp(".") == List()) //I would have expected List("", "") 
(sp("a.b") == List("a", "b")) //expected 
(sp(".b") == List("", "b")) //expected 
(sp("a.") == List("a")) //I would have expected List("a", "") 
(sp("..") == List()) // I would have expected List("", "", "") 
(sp(".a.") == List("", "a")) // I would have expected List("", "a", "") 

поэтому я ожидал, что раскол будет возвращать массив с (числом сепаратора вхождений) + 1 элемент, но это явно не так.

Это почти выше, но удалите все завершающие пустые строки, но это не так для разделения пустой строки.

Я не могу идентифицировать шаблон здесь. Какие правила выполняет StringOps.split?

Для бонусных очков есть ли хороший способ (без слишком большого количества копий/добавление строк), чтобы получить раскол, который я ожидаю?

ответ

3

Заинтересовавшись, вы можете найти здесь код. https://github.com/scala/scala/blob/v2.12.0-M1/src/library/scala/collection/immutable/StringLike.scala

См. Функцию split с символом в качестве аргумента (строка 206).

Я думаю, что общий шаблон, проходящий здесь, - все конечные пустые результаты расщепления игнорируются.

За исключением первого, для которого «если разделитель не найден, а просто отправить всю строку», применяется логика.

Я пытаюсь найти, если вокруг них есть проектная документация.

Кроме того, если вы используете строку вместо символа для разделителя, она вернется к расколу java regex. Как уже упоминалось @LRLucena, если вы предоставите параметр предела со значением больше, чем размер, вы получите свои завершающие пустые результаты. см http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String,%20int)

+0

Спасибо, я просто запросил запрос на документацию. – Martijn

2

Вы можете использовать split с регулярным выражением. Я не уверен, но я предполагаю, что второй параметр является наибольшим размером результирующего массива.

def sp(str: String) = str.split("\\.", str.length+1).toList 
0

Кажется, в соответствии с этими тремя правилами:

1) Скользящий пустые подстроки отбрасываются.

2) Пустая подстрока считается завершающей, прежде чем она будет считаться ведущей, если применимо.

3) Первый случай, без разделителей, является исключением.

+0

nulls? Я, конечно, надеюсь, что нет. – Martijn

+0

Простите мою неряшливую номенклатуру. Я бы сказал, что я говорю в общем, но тогда я снова столкнулся с проблемой. Zero длина струнные. –

0

split следует поведение http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

То есть раскол «вокруг» символ-разделитель, со следующими исключениями:

  • Независимо от того, что-нибудь еще, разделив пустая строка всегда будет давать Array("")
  • Удаляются любые конечные пустые подстроки
  • Суррогатные символы совпадают только в том случае, если совпадающий символ не является частью суррогатной пары.
Смежные вопросы