【发布时间】:2011-09-26 22:12:41
【问题描述】:
现在我正在对字符串执行split,并假设用户的换行符是\r\n,如下所示:
string.split(/\r\n/)
我想做的是拆分\r\n 或只是\n。
那么正则表达式将如何拆分其中任何一个?
【问题讨论】:
现在我正在对字符串执行split,并假设用户的换行符是\r\n,如下所示:
string.split(/\r\n/)
我想做的是拆分\r\n 或只是\n。
那么正则表达式将如何拆分其中任何一个?
【问题讨论】:
你试过/\r?\n/ 吗? ? 使 \r 可选。
【讨论】:
\rs。
\r?
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
我没有针对您的场景进行测试,但我敢打赌它会比手动选择换行符更好。
# Split on \r\n or just \n
string.split( /\r?\n/ )
虽然它对这个问题没有帮助(您确实需要正则表达式),但请注意 String#split 不需要正则表达式参数。您的原始代码也可能是string.split( "\r\n" )。
【讨论】:
\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"]
【讨论】:
Ruby 中的交替运算符Regexp 与标准正则表达式中的相同:|
所以,显而易见的解决方案是
/\r\n|\n/
与
相同/\r?\n/
即可选的\r,后跟强制的\n。
【讨论】:
|,因为这样会降低效率。
Regexp 不是图灵完备的(好吧,Ruby 1.9 实际上可能是),因此,与普通编程语言不同,并非每次优化尝试都会自动解决停机问题。跨度>
你是从文件中读取,还是从标准输入中读取?
如果您正在从文件中读取,并且文件处于文本模式,而不是二进制模式,或者您正在从标准输入中读取,则无需处理 \r\n - 它只需看起来像\n。
C:\Documents and Settings\username>irb
irb(main):001:0> gets
foo
=> "foo\n"
【讨论】:
也许只对 '\n' 进行拆分,如果存在 '\r' 则删除它?
【讨论】:
另一种选择是使用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
【讨论】: