拆分不同的换行符

时间:2011-07-01 17:14:41

标签: ruby regex split newline

现在我正在对字符串执行split并假设用户的换行符为\r\n,如下所示:

string.split(/\r\n/)

我想要做的是分为\r\n\n

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

8 个答案:

答案 0 :(得分:75)

你试过/\r?\n/吗? ?使\r可选。

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

答案 1 :(得分:16)

Ruby有方法String#each_lineString#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

我没有根据您的情况对其进行测试,但我敢打赌它会比手动选择换行符更好。

答案 2 :(得分:15)

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

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

答案 3 :(得分:4)

\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"]

答案 4 :(得分:3)

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

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

/\r\n|\n/

相同
/\r?\n/

即。可选的\r后跟强制\n

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

另一个选择是使用String#chomp,它也可以自己智能地处理换行符。

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

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