scala string.split不起作用

ris*_*p89 29 string split scala

以下是我的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)
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 75

如果使用引号,则需要正则表达式拆分. |是"或"字符,所以你的正则表达式什么都不匹配.所以一切都是分裂的.

如果您使用split('|')或者split("""\|""")您应该得到您想要的.

  • `'c'`是一个单一的角色.`"""这是一个(文字)字符串,而不是一个字符.""" (4认同)
  • `"""stuff"""引用一个文字字符串.`"stuff"`解释转义字符.由于反斜杠是Java字符串_和_正则表达式中的转义字符_both_,因此您需要转义转义字符以使其进入正则表达式:`"\\ |"`.这会很快让人感到困惑,所以最好使用三引号并输入文字字符串. (3认同)

Esk*_*sko 7

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

由于java.lang.String#split(String regex); 接受一个正则表达式,你将字符串拆分为"none OR none",这是关于正则表达式拆分的另一个特性,其中没有一个实质上意味着"在每个单个字符之间".

为了得到你想要的东西,你需要正确地逃避你的正则表达式.逃脱模式,你需要预先考虑性格\既然\是一个特殊String字符(想\t\r为例),实际上你需要双逃逸,让你结了s.split("\\|").

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


小智 6

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