现在我正在对字符串执行split
并假设用户的换行符为\r\n
,如下所示:
string.split(/\r\n/)
我想要做的是分为\r\n
或\n
。
那么正则表达式将如何拆分其中任何一个?
答案 0 :(得分:75)
你试过/\r?\n/
吗? ?
使\r
可选。
答案 1 :(得分:16)
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
我没有根据您的情况对其进行测试,但我敢打赌它会比手动选择换行符更好。
答案 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