2016-02-27 271 views
2

在斯卡拉,我有一個由一組句子組成的文本。 我試圖分裂這個文本變成單獨的句子是這樣的:使用「。」不能正確分割文本。分隔符

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

您是否有一個最小示例在手?我是斯卡拉的初學者,但我想幫忙。 – 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

這是Strings庫中的一個不一致的情況。一些方法採用字符串字面值作爲其他方式表達的正則表達式作爲一個字符串,最好的方法是看看ScalaDocs或者在每次做這樣的事情時在REPL上做實驗 – marios

+1

@octavian傳遞字符串'\ .',但是用Scala中的內容表示字符串,你需要[逃避反斜槓](https://xkcd.com/1638/),所以它變成'\\'。 – Clashsoft