このコードは機能すると思いましたが、正規表現は\ r\nと一致しません。読み込んでいるデータを16進エディタで表示し、ファイルに実際に16進Dと16進Aのパターンがあることを確認しました。
正規表現/\xD\xA/mおよび/\x0D\x0A/mも試しましたが、一致しませんでした。
これは今の私のコードです:
lines2 = lines.gsub( /\r\n/m, "\n" )
if ( lines == lines2 )
print "still the same\n"
else
print "made the change\n"
end
代替案に加えて、私が何を間違っているのかを知ることは素晴らしいことです(私の側でいくつかの学習を促進するため)。 :)
puts lines
を実行すると何が得られますか?それが手がかりになります。
デフォルトでは、File.open
はテキストモードでファイルを開くため、\r\n
文字は\n
に自動的に変換されます。たぶんそれがlines
が常にlines2
と等しい理由です。 Ruby=が行末を解析しないようにするには、rb
モードを使用します。
C:\> copy con lala.txt a file with many lines ^ Z C:\> irb irb(main):001:0> text = File.open( 'lala.txt')。read => "a\nfile\nwith\nmany\nlines\n " irb(main):002:0> bin = File.open( 'lala.txt'、 'rb')。read =>" a\r\nfile\r\nwith\r\nmany\r\nlines\r\n " irb(main):003:0>
しかし、あなたの質問とコードから、デフォルトの修飾子でファイルを開くだけでいいことがわかります。変換は不要で、短いFile.read
を使用できます。
String#strip を使用します
先頭および末尾の空白を削除したstrのコピーを返します。
例えば
" hello ".strip #=> "hello"
"\tgoodbye\r\n".strip #=> "goodbye"
Gsubを使用する
string = string.gsub(/\r/," ")
string = string.gsub(/\n/," ")
一般に、\ rまたは\ nの除去を扱うときは、次のようなことをして両方を探します。
lines.gsub(/\r\n?/, "\n");
データの保存方法(使用するOS、使用するエディター、当時のIoとのジュピターの関係)に応じて、改行の後に改行がある場合とない場合があります。 16進モードで両方の文字が表示されるのは奇妙に思えます。お役に立てれば。
modified_string = string.gsub(/\s+/, ' ').strip
Railsを使用している場合、squish
メソッドがあります
"\tgoodbye\r\n".squish => "goodbye"
"\tgood \t\r\nbye\r\n".squish => "good bye"
lines2 = lines.split.join("\n")
"still the same\n".chomp
または"still the same\n".chomp!
http://www.Ruby-doc.org/core-1.9.3/String.html#method-i-chomp
次はどうですか?
irb(main):003:0> my_string = "Some text with a carriage return \r"
=> "Some text with a carriage return \r"
irb(main):004:0> my_string.gsub(/\r/,"")
=> "Some text with a carriage return "
irb(main):005:0>
または...
irb(main):007:0> my_string = "Some text with a carriage return \r\n"
=> "Some text with a carriage return \r\n"
irb(main):008:0> my_string.gsub(/\r\n/,"\n")
=> "Some text with a carriage return \n"
irb(main):009:0>
あなたの正規表現はほぼ完全だと思います-私がすることは次のとおりです:
lines2 = lines.gsub(/[\r\n]+/m, "\n")
上記では、クラスに\ rと\ nを入れて(そのように表示される順序は関係ありません)、「+」修飾子を追加しました(したがって、「\ r\n\r\n\r\n "も1回一致し、全体が"\n "に置き換えられます)
バイナリモードではなく、テキストモードでファイルを読み取らないのはなぜですか?
ちょうど別のバリアント:
lines.delete(" \n")
これを使用できます:
my_string.strip.gsub(/\s+/, ' ')
lines.map(&:strip).join(" ")
def dos2unix(input)
input.each_byte.map { |c| c.chr unless c == 13 }.join
end
remove_all_the_carriage_returns = dos2unix(some_blob)