[英]Split on different newlines
現在我正在對字符串進行split
,並假設用戶的換行符是\r\n
,如下所示:
string.split(/\r\n/)
我想做的是拆分\r\n
或只是\n
。
那么正則表達式將如何拆分其中的任何一個?
你試過/\r?\n/
嗎? ?
使\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
。
也許只對'\n'進行拆分並刪除'\r'(如果存在)?
您是從文件中讀取,還是從標准輸入中讀取?
如果您正在從文件中讀取,並且該文件處於文本模式,而不是二進制模式,或者您正在從標准輸入中讀取,則不必處理\r\n
- 它看起來像\n
。
C:\Documents and Settings\username>irb
irb(main):001:0> gets
foo
=> "foo\n"
另一種選擇是使用String#chomp ,它也可以自己智能地處理換行符。
您可以通過以下方式完成您所追求的目標:
lines = string.lines.map(&:chomp)
或者,如果您正在處理的事情足夠大,以至於 memory 使用是一個問題:
<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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.