30

我有一个用 ruby​​ 编写的脚本。我需要删除任何重复的换行符(例如)

\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

你确定它不应该是 /\n\n\n/, "\n" 你在上面的问题中似乎想要的东西。

另外,你确定它不是在做 Windows 换行符“\r\n”吗?

编辑:附加信息

每条评论

“换行的数量可以改变。不同的行有 2 到 5 个换行。”

如果你只想打 2-5 行试试这个

/\n{2,5}/, "\n"
于 2009-03-31T13:29:35.340 回答
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 回答
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

简单地调用 split 也会删除你所有的空白。

您需要通过\n拆分

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

此外,还适用于

  • 空行上的空格
  • n 背靠背空行数

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

在哪里,

  • \n 当然是换行符
  • \s 是空格
  • 在 \s 之后使用时表示 1 个或多个空格
于 2011-08-26T17:23:01.543 回答
-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 回答