2013-05-27 122 views
5

我想分割文本分組與|分隔符。 123.123.123.123|000.000.000.000給每個ip地址塊。但是每個數字不會被|分開。分隔字符串分隔符分裂成Scala中的每個字符

scala> "123.123.123.123|000.000.000.000".split("|") 
res30: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, |, 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0) 

scala> "123.123.123.123".split("|") 
res33: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3) 

所以我把分隔符作爲Char,它顯示了我的意圖。

scala> "123.123.123.123|000.000.000.000".split('|') 
res31: Array[String] = Array(123.123.123.123, 000.000.000.000) 

scala> "123.123.123.123".split('|') 
res32: Array[String] = Array(123.123.123.123) 

爲什麼單個字符會產生巨大的差異?

我讀過Scala doc和StringLike.scala,但沒有得到答案。

def split(separators: Array[Char]): Array[String] 
def split(separator: Char): Array[String] 

謝謝。

+0

根據[documentation](http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.StringOps),'split'將Char作爲參數。 – squiguy

+2

@squiguy不僅char:它可以回到[java的split,它接受String](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java。 lang.String))[regex] –

+0

@ om-nom-nom當然,在這種情況下,'''是特殊的,這顯然就是你在答案中所說的。 – squiguy

回答

11

拆分方法接受string或字符。如果使用字符串,它將被解釋爲正則表達式,「|」被視爲正則表達式'或' - 在你的情況下,它返回到'每個角色去它自己的bin'。逃避它有原料分隔符:

"123.123.123.123|000.000.000.000".split("\\|") 
res1: Array[String] = Array(123.123.123.123, 000.000.000.000) 

字符分隔符被解釋爲是,那麼你得到了想要的結果沒有任何大驚小怪

+0

Thanks @ om-nom-nom! 我忘了記得許多Scala方法實際上來自java.lang和Java類。我將在下次與javadoc。 – eces

2

需要注意的是,作爲OM-NOM-NOM正確地提到(但沒提供的示例中),人物(其被包圍在單個')也是有效的:

"123.123.123.123|000.000.000.000".split('|') 

我發現這是更加明顯/讀取。我也假設這會更快,因爲它不必調用正則表達式解析器。但這當然是猜測,也是不必要的微觀優化。

+0

它應該比regexing快得多 - 毫無疑問。實際上,在這種情況下,只是一個錯誤。但問題不在於此,而且你所建議的實際上已經在問題中被發現了。 –

+0

是的,我說om-nom-nom已經提到過它。我只是想提供一個實際的例子,因爲我知道很多人(包括我自己)通常只會爲一段代碼尋找答案,這通常是解決方案。由於我認爲om-nom-nom的代碼示例並不是最優的,所以我發佈了自己的:) – fresskoma

+1

@ x3ro,我沒有寫這個,因爲op在他的例子中是這樣做的(res31);-)但我同意這可能會比字符串版本 –