ルビーで書かれたスクリプトがあります。重複した改行を削除する必要があります (例)
\n
\n
\n
に
\n
私の現在の試みはうまくいきました(またはうまくいきませんでした)
str.gsub!(/\n\n/, "\n")
これにより、出力に変化はありませんでした。私は何を間違っていますか?
これは私のために働く:
#!/usr/bin/ruby
$s = "foo\n\n\nbar\nbaz\n\n\nquux";
puts $s
$s.gsub!(/[\n]+/, "\n");
puts $s
String#squeeze
の代わりにより慣用的なを使用してくださいgsub
。
str = "a\n\n\nb\n\n\n\n\n\nc"
str.squeeze("\n") # => "a\nb\nc"
複数の改行を無限に一致させる必要があります。コード例は、わずかな調整で機能します。
str.gsub!(/\n+/, "\n")
例えば:
str = "this\n\n\nis\n\n\n\n\na\ntest"
str.gsub!(/\n+/, "\n") # => "this\nis\na\ntest"
/\n\n\n/、「\n」であってはいけませんか?それは、上記の質問で求めているようです。
また、Windows の改行 "\r\n" を実行していませんか?
編集:追加情報
コメントごと
「改行の量は変わる可能性があります。異なる行には2〜5個の改行があります。」
2〜5行だけをヒットしたい場合は、これを試してください
/\n{2,5}/, "\n"
行を分割して再結合するだけで、目的の結果が得られます
>> "one\ntwo\n\nthree\n".split.join("\n")
=> "one\ntwo\nthree"
編集:これにより、すべての空白の部分文字列が改行に置き換えられることに気付きました。
>> "one two three\n".split.join("\n")
=> "one\ntwo\nthree"
まず、これがあなたが望むものであることを確認してください!
さらに、
str.gsub!/ \ n ^ \ s * \ n /、 "\ n \ n"
どこ、
splitを呼び出すだけでも、すべての空白が削除されます。
\n
分割するには合格する必要があります
>> "one ok \ntwo\n\nthree\n".split(/\n+/).join("\n")
=> "one ok \ntwo\nthree"
これを試してみてください。
s = test\n\n\nbar\n\n\nfooo
s.gsub("\n\n", '')
Ruby では、指定したものとは異なる方法でバックスラッシュをエスケープする必要があります。
str.sub!("\\\\n+\\\\n","\\\\n")