現在、文字列に対して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"
もう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