规范化Ruby中的行结尾

Pet*_*ter 29 ruby newline line-breaks

我在Ruby中有一个字符串,s(说)这可能拥有的任何标准行结尾的(\n,\r\n,\r).我想将所有这些转换为\ns.什么是最好的方式?

这似乎是一个超常见的问题,但没有太多关于它的文档.显然有简单的原油解决方案,但有没有内置的处理这个?

优雅,惯用的Ruby解决方案是最好的.

编辑:意识到^M并且\r是一样的.但仍有三种情况.(见维基百科.)

Gre*_*reg 39

从ruby 1.9开始,您可以使用String::encodewith universal_newline: true来获取所有新行,\n同时保持编码不变:

s.encode(s.encoding, universal_newline: true)
Run Code Online (Sandbox Code Playgroud)

一旦处于已知的换行状态,您就可以使用自由转换回CRLF :crlf_newline.例如:将未知(可能是混合)结尾的文件转换为CRLF(例如),以二进制模式读取,然后:

s.encode(s.encoding, universal_newline: true).encode(s.encoding, crlf_newline: true)
Run Code Online (Sandbox Code Playgroud)

  • 你不需要包含第一个`s.encoding`,一个简单的`s.encode(universal_newline:true)`或`s.encode(crlf_newline:true)`就可以了.这帮助了我今天的项目. (6认同)
  • @Donovan - 你可能是对的,但是文档说没有显式编码的版本将转码为“Encoding.default_internal”,这可能是也可能不是你想要的。我的版本将保守地保留您当前的编码。 (2认同)
  • true 并且您提出了一个很好的观点,但在大多数情况下,默认值就可以了,毕竟,这就是 `String.new` 使用的内容。因此,就我而言(我可以说大多数情况下),这是多余的。 (2认同)

Jos*_*Lee 37

最好只是处理你想要特别改变的两种情况,而不是试图变得太聪明:

s.gsub /\r\n?/, "\n"
Run Code Online (Sandbox Code Playgroud)