【问题标题】:scala string.split does not workscala string.split 不起作用
【发布时间】:2012-07-01 18:49:54
【问题描述】:

以下是我的 REPL 输出。我不确定为什么 string.split 在这里不起作用。

val s = "Pedro|groceries|apple|1.42"
s: java.lang.String = Pedro|groceries|apple|1.42

scala> s.split("|")
res27: Array[java.lang.String] = Array("", P, e, d, r, o, |, g, r, o, c, e, r, i, e, s, |, a, p, p, l, e, |, 1, ., 4, 2)

【问题讨论】:

    标签: string scala split


    【解决方案1】:

    如果您使用引号,则表示您要求进行正则表达式拆分。 | 是“或”字符,因此您的正则表达式不匹配或不匹配。所以一切都分裂了。

    如果你使用split('|')split("""\|"""),你应该得到你想要的。

    【讨论】:

    • 好一个。在scala中,''和""有什么区别?
    • """stuff""" 引用文字字符串。 "stuff" 解释转义字符。由于反斜杠是 Java 字符串 正则表达式中的转义字符 both,因此您需要转义转义字符才能将其放入正则表达式:"\\|"。这很快就会非常混淆,所以最好使用三引号并使用文字字符串。
    • and...'somestring' 与 """somestring""" 相同吗?
    • 'c' 是单个字符。 """This is a (literal) string, not a single character."""
    • 啊...我明白了。我来自 JavaScript,看起来我忘记了一些基本的东西。
    【解决方案2】:

    | 是一个特殊的正则表达式 字符,用作OR 操作的逻辑运算符。

    由于java.lang.String#split(String regex); 接受正则表达式,因此您将使用 "none OR none" 拆分字符串,这是正则表达式拆分的另一个特点,其中 none 本质上是指“在每个字符之间”

    要得到你想要的,你需要正确地转义你的正则表达式模式。要转义该模式,您需要在字符前面加上\,并且由于\ 是一个特殊的String 字符(例如\t\r),您实际上需要双重转义,以便您'最终会得到s.split("\\|")

    有关完整的 Java 正则表达式语法,请参阅 java.util.regex.Pattern javadoc

    【讨论】:

      【解决方案3】:

      Split 将正则表达式作为第一个参数,因此您的调用被解释为“空字符串或空字符串”。要获得预期的行为,您需要转义管道字符“\\|”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多