web-dev-qa-db-ja.com

異なる改行で分割

現在、文字列に対してsplitを実行していますが、ユーザーからの改行は\r\n そのようです:

string.split(/\r\n/)

私がやりたいのは、\r\n あるいは単に \n

それでは、正規表現はこれらのどちらに分割されるのでしょうか?

51
Shpigford

試しましたか /\r?\n/?\rオプション。

使用例: http://rubular.com/r/1ZuihD0YfF

75
NickAldwin

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

私はあなたのシナリオに対してテストしませんでしたが、改行文字を手動で選択するよりもうまくいくと思います。

17
23inhouse
_# Split on \r\n or just \n
string.split( /\r?\n/ )
_

この質問では役に立ちません(正規表現が必要な場合)が、_String#split_は正規表現引数を必要としないことに注意してください。元のコードはstring.split( "\r\n" )である可能性もあります。

15
Phrogz
\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
Clark

Ruby Regexpの代替演算子は、標準の正規表現と同じです:|

したがって、明らかな解決策は

/\r\n|\n/

と同じです

/\r?\n/

つまり、オプションの\rの後に必須の\n

3
Jörg W Mittag

おそらく、「\ n」のみで分割を行い、「\ r」が存在する場合は削除しますか?

1
SjoerdRavn

ファイルから読み込みますか、それとも標準入力から読み込みますか?

ファイルから読み取りを行い、ファイルがバイナリモードではなくテキストモードである場合、または標準入力から読み取る場合は、\r\nを処理する必要はありません。 \nなど。

C:\Documents and Settings\username>irb
irb(main):001:0> gets
foo
=> "foo\n"
1
Andrew Grimm

もう1つのオプションは、 String#chomp を使用することです。これも、改行をインテリジェントに処理します。

あなたは次のようなものであなたがいるものを達成することができます:

lines = string.lines.map(&:chomp)

または、メモリの使用が懸念されるほど大きなものを扱っている場合:

<string|io>.each_line do |line|
  line.chomp!
  #  do work..
end

この種の問題を解決するとき、パフォーマンスは常に最も重要なことではありませんが、正規表現を使用するよりもちょっぴり解決策が少し速いことに注意する価値があります。

私のマシン(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
0
Matt Sanders