簡體   English   中英

在不同的換行符上拆分

[英]Split on different newlines

現在我正在對字符串進行split ,並假設用戶的換行符是\r\n ,如下所示:

string.split(/\r\n/)

我想做的是拆分\r\n或只是\n

那么正則表達式將如何拆分其中的任何一個?

你試過/\r?\n/嗎? ? 使\r可選。

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

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

我沒有針對您的場景對其進行測試,但我敢打賭它會比手動選擇換行符更好。

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM