2016-02-27 1 views
2

В Scala у меня есть текст, который состоит из набора предложений. Я пытаюсь разделить этот текст на отдельные предложения, как это:Текст не разбивается правильно, используя «.». delimiter

val sentences: Array[String] = text.split(".") 

Однако, когда я проверяю sentences массив (например, в следующей строке), я наблюдаю, что массив пуст:

println("Sentences are: " + sentences.mkString(" ")) 

Почему расщепление выполнено неправильно?

Текст:

A sword is a bladed weapon intended for both cutting and thrusting. The precise definition of the term varies with the historical epoch or the geographical region under consideration. A sword in the most narrow sense consists of a straight blade with two edges. 

Выход есть:

Sentences are: 
+1

У вас есть пример с мин. Я новичок в Scala, но я хочу помочь. – gsamaras

+0

Я тоже говорил о коде. :) – gsamaras

+0

Код, содержащий его немного сложнее, я не думаю, что это поможет. – octavian

ответ

5

String.split ожидает регулярное выражение, и . означает «ничего» в регулярных выражениях, так что вам нужно, чтобы избежать его :

val sentences: Array[String] = text.split("\\.") 

Теперь, если ваш разделитель является единственным символом, вы можете использовать перегруженный метод split(char), который не будет интерпретировать аргумент как регулярное выражение.

val sentences: Array[String] = text.split('.') 
+0

считают это полезным, проголосуйте за меня. –

2

Метод java.lang.String#split(String) разделяет RegEx, а не последовательность символов. . - специальный символ регулярного выражения, который соответствует любому знаку (включая буквы). Таким образом, вы заканчиваете расщепление на всего, которое дает пустой массив. Вы можете избежать этого, избегая символа . в регулярном выражении:

val sentences: Array[String] = text.split("\\.") 
             //^escape using \ 
+0

Зачем ему нужен двойной \ в этом случае? Например, код 'replaceAll (" \ "", "") 'также работает, хотя он имеет только один. – octavian

+1

Это несогласованность в библиотеке строк. Некоторые методы принимают строковый литерал, так как в шаблоне другие принимают выраженное выражение как строка. Лучшим способом является просмотр ScalaDocs или эксперимент на REPL каждый раз, когда вы делаете что-то вроде этого. – marios

+1

@octavian вы передаете строку '\ .', но чтобы выразить строковый литерал с этим контентом в Scala, вам нужно [избегать escape-косой черты побега] (https://xkcd.com/1638/), поэтому он становится '\\'. – Clashsoft

Смежные вопросы