Scala中的新行字符

Lui*_*hys 21 scala newline

Scala中是否有新行字符的简写?在Java(在Windows上)我通常只使用"\n",但这似乎在Scala中不起作用 - 特别是

val s = """abcd
efg"""
val s2 = s.replace("\n", "")
println(s2)
Run Code Online (Sandbox Code Playgroud)

输出

abcd
efg
Run Code Online (Sandbox Code Playgroud)

在Eclipse中,

efgd
Run Code Online (Sandbox Code Playgroud)

(原文如此)来自命令行,和

abcdefg
Run Code Online (Sandbox Code Playgroud)

来自REPL(伟大的成功!)

String.format("%n") 有效,但还有什么更短的吗?

Ed *_*aub 23

返回特定于平台的行分隔符

sys.props("line.separator")
Run Code Online (Sandbox Code Playgroud)

这将为您提供"\n"或"\ r \n",具体取决于您的平台.您可以根据需要将其包装在val中,但当然不能将其嵌入字符串文字中.

如果您正在阅读不遵守平台规则的文本,这显然无济于事.

参考文献:

  • 使用java 7也可以使用`System.lineSeparator()` (9认同)

Jam*_*Iry 15

你的Eclipse使换行标记成为标准的Windows\r \n,所以你有"abcd\r \nefg".正则表达式将其变为"abcd\refg",而Eclipse控制台正在使用与Windows shell的运行方式略有不同的方式.REPL只是使用\n作为新行标记,因此它按预期工作.

解决方案1:将Eclipse更改为仅使用\n换行符.

解决方案2:当您需要控制换行符,使用单引号和显式\n字符时,不要使用三重引号字符串.

解决方案3:使用更复杂的正则表达式替换\ r \n,\n或\ r \n

  • 没有人提到s.lines.mkString?使用面向行的函数来避免处理换行符. (3认同)
  • 3.1实际上,`replace`不接受正则表达式,`replaceAll`就是这样.3.2此外,`"\n"`不是正则表达式换行符,它是字符串中的Java新行.正则表达式换行符必须写为"\\n"或""""\n"""`. (2认同)

Dmi*_*urg 7

如果您确定该操作系统中使用的文件的行分隔符,则应执行以下操作:

s.replaceAll(System.lineSeparator, "")
Run Code Online (Sandbox Code Playgroud)

在其他地方你的正则表达式应检测以下换行序列:"\n"(Linux),"\ r"(Mac),"\ r \n"(Windows):

s.replaceAll("(\r\n)|\r|\n", "")
Run Code Online (Sandbox Code Playgroud)

第二个更短,我认为更正确.


小智 6

试试这个有趣的建筑:)

import scala.compat.Platform.EOL
println("aaa"+EOL+"bbb")
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 5

var s = """abcd
efg""".stripMargin.replaceAll("[\n\r]","")
Run Code Online (Sandbox Code Playgroud)