题 拆分不同的换行符


现在我正在做一个 split 在字符串上并假设用户的换行符是 \r\n 像这样:

string.split(/\r\n/)

我想做的就是分开 \r\n 要不就 \n

那么正则表达式将如何拆分其中任何一个?


49
2017-07-01 17:14


起源




答案:


你试过了吗 /\r?\n/ ?该 ? 做的 \r 可选的。

用法示例: http://rubular.com/r/1ZuihD0YfF


72
2017-07-01 17:17



这是解决错误问题的正确方法。你不应该做 \r在你的文字中。 - Andrew Grimm
@AndrewGrimm,为什么你认为用户永远不应该拥有 \r在他的文字中? - Kirk Woll
如果这些线只是\ r? - Arnold Roa


# Split on \r\n or just \n
string.split( /\r?\n/ )

虽然它对这个问题没有帮助(你需要一个正则表达式),但请注意 String#split 不需要正则表达式参数。您的原始代码也可能是 string.split( "\r\n" )


15
2017-07-01 17:17





Ruby有方法 String#each_line 和 String#lines

返回枚举: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-each_line

返回一个数组: http://www.ruby-doc.org/core-2.1.2/String.html#method-i-lines

我没有针对你的场景测试它,但我敢打赌它会比手动选择换行符更好。


14
2017-07-24 04:15



这就是我想要的。出于某种原因,它保持着 \n\r,我不得不使用 .map(&:squish) 在阵列上。 - emptywalls


Ruby中的交替运算符 Regexp 与标准正则表达式中的相同: |

所以,显而易见的解决方案是

/\r\n|\n/

这是一样的

/\r?\n/

即一个可选的 \r 其次是强制性的 \n


3
2017-07-01 17:18



“和”一样“?不必要。一般来说,避免这种情况是件好事 | 在可能的情况下使用正则表达式,因为它使它们效率更低。 - NickAldwin
@NickAldwin:我的意思是语义。我认为任何中途不错的编译器应该能够合并公共前缀和后缀并将第一个表单转换为第二个表单,不是吗?毕竟, Regexp 不是图灵完整的(好吧,Ruby 1.9实际上可能是 是),因此,与普通编程语言不同,并非每次优化尝试都会自动涉及解决暂停问题。 - Jörg W Mittag


也许只对'\ n'进行拆分并删除'\ r'(如果存在)?


1
2017-07-01 17:17





您是从文件中读取还是从标准读取?

如果您正在读取文件,并且文件处于文本模式,而不是二进制模式,或者您正在从标准读取,则不必处理 \r\n  - 它只是看起来像 \n

C:\Documents and Settings\username>irb
irb(main):001:0> gets
foo
=> "foo\n"

1
2017-07-03 23:10





另一种选择是使用 串#格格,它还可以智能地处理换行。

你可以通过以下方式完成你的目标:

lines = string.lines.map(&:chomp)

或者,如果您正在处理足够大的内存,那么内存使用是一个问题:

<string|io>.each_line do |line|
  line.chomp!
  #  do work..
end

在解决此类问题时,性能并不总是最重要的事情,但值得注意的是,chomp解决方案也比使用正则表达式快一点。

在我的机器上(i7,ruby 2.1.9):

Warming up --------------------------------------
           map/chomp    14.715k i/100ms
  split custom regex    12.383k i/100ms
Calculating -------------------------------------
           map/chomp    158.590k (± 4.4%) i/s -    794.610k in   5.020908s
  split custom regex    128.722k (± 5.1%) i/s -    643.916k in   5.016150s

0
2017-08-16 23:34





\n is for unix 
\r is for mac 
\r\n is for windows format

为操作系统安全。我会做/ \ r?\ n | \ r \ n?/ /

"1\r2\n3\r\n4\n\n5\r\r6\r\n\r\n7".split(/\r?\n|\r\n?/)
=> ["1", "2", "3", "4", "", "5", "", "6", "", "7"]

0
2018-04-11 17:31