拆分不同的换行符
现在,我正在对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_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
我没有对你的情况进行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"]