我编写了一个简短的函数来从多行字符串文字中删除前导空格并连接这些行,就像你写出了几个连接的字符串或一个非常长的字符串一样。
def stripMultiline(input : String) =
input.split("\n").map(_.dropWhile(_.isWhitespace).stripLineEnd).mkString
它的工作方式与我在REPL中的预期方式相同:
scala> val longString =
| """
| one fish,
| two fish,
| red fish,
| blue fish
| """
scala> stripMultiline(longString)
res0: String = one fish, two fish, red fish, blue fish
但是,如果我将相同的代码放入main
方法并使用scalac
进行编译,我会看到不同的内容:
package substitutions
object Main {
def stripMultiline(input : String) =
input.split("\n").map(_.dropWhile(_.isWhitespace).stripLineEnd).mkString
def main(args : Array[String]): Unit = {
val text =
"""
one fish,
two fish,
red fish,
blue fish
"""
val oneLine = stripMultiline(text)
println(oneLine)
}
}
(回到控制台)
C:\KC\code\scala\sub>scala substitutions.Main
blue fish
我正在为REPL和Scalac运行Scala 2.10
。我在Windows 7 32位和64位上看到了错误。谁能想到为什么这两种版本的行为都不一样?它把我扔了一圈。这是我的逻辑中的问题,还是我应该提交错误报告?
答案 0 :(得分:4)
您的问题是source file encoding:
scala> stripMultiline("\r\n one fish, \r\n two fish, \r\n red fish, \r\n blue fish\r\n ")
"lue fish ng = "one fish,
scala> stripMultiline("\n one fish, \n two fish, \n red fish, \n blue fish\n ")
res1: String = one fish, two fish, red fish, blue fish
在split("\n")
之后,您会在每一行中获得\r
(Carriage return)。
作为修补程序,您可以在(\r)?\n
上分割您的行:
def stripMultiline(input : String) =
input.split("(\r)?\n").map(_.dropWhile(_.isWhitespace).stripLineEnd).mkString
stripMultiline: (input: String)String
scala> stripMultiline("\r\n one fish, \r\n two fish, \r\n red fish, \r\n blue fish\r\n ")
res0: String = one fish, two fish, red fish, blue fish