6

我正在尝试使用|条形分隔符拆分文本束。123.123.123.123|000.000.000.000到每个 ip 地址块。但是每个数字都不是由 分割的|

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)

所以我把分隔符 as 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]

谢谢。

4

2 回答 2

12

Split 方法接受字符串或字符。如果您使用字符串,它将被解释为正则表达式和“|” 被视为正则表达式“或”-在您的情况下,它返回到“每个字符都进入它自己的垃圾箱”。转义它以获得原始分隔符:

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

字符分隔符按原样解释,因此您无需大惊小怪即可获得所需的结果

于 2013-05-27T07:17:37.413 回答
2

请注意,正如 om-nom-nom 正确提到的(但未提供示例),字符(包含在 single 中')也是有效的:

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

我发现这更明显/可读。我还假设这会更快,因为它不必调用正则表达式解析器。但这当然是猜测,也是不必要的微优化。

于 2013-05-27T17:26:09.947 回答