30

ルビーで書かれたスクリプトがあります。重複した改行を削除する必要があります (例)

\n
\n
\n

\n

私の現在の試みはうまくいきました(またはうまくいきませんでした)

str.gsub!(/\n\n/, "\n")

これにより、出力に変化はありませんでした。私は何を間違っていますか?

4

9 に答える 9

37

これは私のために働く:

#!/usr/bin/ruby

$s = "foo\n\n\nbar\nbaz\n\n\nquux";

puts $s

$s.gsub!(/[\n]+/, "\n");

puts $s
于 2009-03-31T13:33:29.433 に答える
17

String#squeezeの代わりにより慣用的なを使用してくださいgsub

str = "a\n\n\nb\n\n\n\n\n\nc"
str.squeeze("\n") # => "a\nb\nc"
于 2013-09-29T16:27:13.147 に答える
7

複数の改行を無限に一致させる必要があります。コード例は、わずかな調整で機能します。

str.gsub!(/\n+/, "\n")

例えば:

str = "this\n\n\nis\n\n\n\n\na\ntest"
str.gsub!(/\n+/, "\n")  # => "this\nis\na\ntest"
于 2009-03-31T15:45:41.657 に答える
7

/\n\n\n/、「\n」であってはいけませんか?それは、上記の質問で求めているようです。

また、Windows の改行 "\r\n" を実行していませんか?

編集:追加情報

コメントごと

「改行の量は変わる可能性があります。異なる行には2〜5個の改行があります。」

2〜5行だけをヒットしたい場合は、これを試してください

/\n{2,5}/, "\n"
于 2009-03-31T13:29:35.340 に答える
6

行を分割して再結合するだけで、目的の結果が得られます

>> "one\ntwo\n\nthree\n".split.join("\n")
=> "one\ntwo\nthree"

編集:これにより、すべての空白の部分文字列が改行に置き換えられることに気付きました。

>> "one    two three\n".split.join("\n")
=> "one\ntwo\nthree"

まず、これがあなたが望むものであることを確認してください!

于 2009-03-31T13:31:07.347 に答える
1

さらに、

  • 空白行のスペース
  • n連続した空白行の数

str.gsub!/ \ n ^ \ s * \ n /、 "\ n \ n"

どこ、

  • \nはもちろん改行です
  • \sはスペースです
  • \ sの後に使用する場合、1つ以上のスペースを示します
于 2011-08-26T17:23:01.543 に答える
1

splitを呼び出すだけでも、すべての空白が削除されます。

\n分割するには合格する必要があります

>> "one   ok \ntwo\n\nthree\n".split(/\n+/).join("\n")
=> "one  ok \ntwo\nthree"
于 2009-03-31T13:36:34.777 に答える
-1

これを試してみてください。

s = test\n\n\nbar\n\n\nfooo 

s.gsub("\n\n", '')
于 2014-04-30T12:43:43.703 に答える
-2

Ruby では、指定したものとは異なる方法でバックスラッシュをエスケープする必要があります。

str.sub!("\\\\n+\\\\n","\\\\n")

http://www.ruby-forum.com/topic/176239

于 2009-03-31T13:34:36.280 に答える