csv_body = "line 1\r\nline 2\nline 3\rline 4" csv_body.lines # => ["line 1\r\n", "line 2\n", "line 3\rline 4"] # String#lines は \r を改行コードとみなさない csv_body.lines.map(&:chomp) # => ["line 1", "line 2", "line 3\rline 4"] # さらに String#chomp してやらないといけない csv_body.split(/\R/) # => ["line 1", "line 2", "line 3", "line 4"] # String#split を使い、正規表現 /\R/ で区切ると handy CSV.parse(csv_body) # => CSV::MalformedCSVError: Unquoted fields do not allow \r or \n (line 2). # CSV.parse は \r \n \r\n のいずれも受け付けるが混在は許されない
\R
文字列の中には、CR LF のように、複数の文字一続きで1つの意味を表す ようなものが存在します。そのような文字列にマッチするような メタ文字列として以下が存在します。
\R 改行 (?>\x0D\x0A|[\x0A-\x0D\x{85}\x{2028}\x{2029}])
参考
Regular Expressions Reference: Special and Non-Printable Characters
text - What is a cross platform regex for removal of line breaks? - Stack Overflow