拆分不同的换行符

现在,我正在对string进行split ,并假定用户的换行符是\r\n如下所示:

 string.split(/\r\n/) 

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

那么正则expression式是如何分裂的呢?

你有没有试过/\r?\n/ ? 这个? 使\r可选。

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

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

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

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

我没有对你的情况进行testing,但我敢打赌,它会比手动select换行符更好。

Ruby Regexp的交替操作符与标准正则expression式中的相同: |

所以,明显的解决办法是

 /\r\n|\n/ 

这是一样的

 /\r?\n/ 

即可选的\r后面是强制的\n

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

你正在阅读一个文件,或从标准的?

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

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

另一个select是使用String#chomp ,它本身也智能地处理换行符。

你可以用下面这样的东西完成你的工作:

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

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

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

在解决这类问题时,性能并不总是最重要的,但值得注意的是chomp解决scheme比使用正则expression式要快一些。

在我的机器上(i7,ruby2.1.9):

 Warming up -------------------------------------- map/chomp 14.715ki/100ms split custom regex 12.383ki/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 
 \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"]