如何使用Ruby使用一个换行连续替换多行换行符

Mac*_*cha 24 ruby regex newline

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

\n
\n
\n
Run Code Online (Sandbox Code Playgroud)

\n
Run Code Online (Sandbox Code Playgroud)

我当前的尝试有效(或者更确切地说)没有使用

str.gsub!(/\n\n/, "\n")
Run Code Online (Sandbox Code Playgroud)

这让我没有改变输出.我究竟做错了什么?

Cha*_*ens 33

这对我有用:

#!/usr/bin/ruby

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

puts $s

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

puts $s
Run Code Online (Sandbox Code Playgroud)

  • Per @ Keng在下面给出的答案,如果你走这条路并且似乎没有工作,请务必检查`/ [\ r \n] + /` - 这也可能发生在Windows之外.(例如,我的场景是在我的Linux机器上托管的Rails站点上的textarea输入) (3认同)

gio*_*ele 10

使用更惯用String#squeeze而不是gsub.

str = "a\n\n\nb\n\n\n\n\n\nc"
str.squeeze("\n") # => "a\nb\nc"
Run Code Online (Sandbox Code Playgroud)


Ken*_*eng 7

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

另外,您确定它不是在执行 Windows 换行符 "\r\n" 吗?

编辑:附加信息

每条评论

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

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

/\n{2,5}/, "\n"
Run Code Online (Sandbox Code Playgroud)


fin*_*nnw 6

简单地分割和重新组合线将产生期望的结果

>> "one\ntwo\n\nthree\n".split.join("\n")
=> "one\ntwo\nthree"
Run Code Online (Sandbox Code Playgroud)

编辑:我刚注意到这将用换行替换所有空格子串,例如

>> "one    two three\n".split.join("\n")
=> "one\ntwo\nthree"
Run Code Online (Sandbox Code Playgroud)

首先检查这是你想要的!


Pet*_*per 5

您需要将多个换行符匹配到无限量.您的代码示例只需稍微调整即可:

str.gsub!(/\n+/, "\n")
Run Code Online (Sandbox Code Playgroud)

例如:

str = "this\n\n\nis\n\n\n\n\na\ntest"
str.gsub!(/\n+/, "\n")  # => "this\nis\na\ntest"
Run Code Online (Sandbox Code Playgroud)