如何在Scala中按字符串拆分字符串

28

在 Ruby 中,我执行了:

"string1::string2".split("::")

在Scala中,我找不到如何使用字符串而不是单个字符进行split(分割)。

4个回答

82

REPL比Stack Overflow更容易。我只是按原样粘贴了您的示例。

欢迎使用Scala版本2.8.1.final(Java HotSpot Server VM,Java 1.6.0_22)。
输入表达式以对其进行评估。
键入 :help 获取更多信息。

scala> "string1::string2".split("::")
res0: Array[java.lang.String] = Array(string1, string2)

4
这应该是答案。Moritz创建正则表达式的策略可行,但这个简单的解决方案更好。 - iwein
这个答案实际上回答了问题;目前被接受的答案描述了一个可能可行的理论,但并没有描述所问问题的实际答案。 - T.W.R. Cole
1
split 函数存在问题:当你尝试使用"::".split("::")时,你会得到 Nil,但实际上应该得到 List("","")。 - Vitamon
如果是这样的话,那么"aaaaa".split("a") => List("", "", "", "", "", "") -- 对于大多数情况来说并没有提供任何有用的信息。更愿意将其解释为空。 - A---

30

在你的例子中没有影响,但是Scala中的String#split方法实际上需要一个表示正则表达式的String。因此,请确保根据需要转义某些字符,例如在"a..b.c".split("""\.\.""")中,或者为了使这个事实更加明显,您可以在RegEx上调用split方法:"""\.\.""".r.split("a..b.c")


1
啊,是的。我一直以为需要一个正则表达式或字符,而不是字符串,所以它一直在抱怨。 - Félix Saparelli
10
我建议使用\Q\E代替逐个转义。只需在开头添加\Q(或根据需要添加\\Q),在结尾处添加\E即可。 - Daniel C. Sobral
@DanielC.Sobral 很好的想法 - 有没有任何办法可以转义存储在var(常量)中的字符串? - Brent Faust
@Rubistro 你可以使用 scala.util.matching.Regex.quote,或者是Java的等效方法。 - Daniel C. Sobral
@DanielC.Sobral 我发现java.util.regex.Pattern.quote(str)可以将任意字符串字面量转换为正则表达式(用\Q和\E括起来)。 - Brent Faust

12

这行 Ruby 代码在 Scala 中应该也能正常工作,并返回一个 Array[String]


5
如果您查看Java实现,您会发现传递给String#split的参数实际上会被编译成正则表达式。
对于"string1::string2".split("::")没有问题,因为":"只是正则表达式中的一个字符,但是例如"string1|string2".split("|")将不会产生预期的结果。"|"是正则表达式中的替代符号。
scala> "string1|string2".split("|")
res0: Array[String] = Array(s, t, r, i, n, g, 1, |, s, t, r, i, n, g, 2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接