Ruby哪个正则表达式模式将\ n \ n替换为\ n字符串

时间:2015-01-08 10:53:20

标签: ruby-on-rails ruby

我有一个字符串

Java \n\n c# \n\n c/c++

我需要替换它变成

Java \n c# \n c/c++

在Ruby String中使用正则表达式

由于

3 个答案:

答案 0 :(得分:4)

使用String类的squeeze函数

[18] pry(main)> "Java \n\n c# \n\n c/c++".squeeze("\n")
 => "Java \n c# \n c/c++"

但是,它会返回一个新字符串,其中此集合中出现的相同字符的运行将被单个字符替换,所以

 [18] pry(main)> "Java \n\n\n\n\n c# \n\n\n\n\n c/c++".squeeze("\n")
 => "Java \n c# \n c/c++"

答案 1 :(得分:1)

你可能也希望消除三重等现象。在这种情况下,最好的选择是使用匹配计数器:

#                                  ⇓⇓⇓⇓
'Java \n\n c# \n\n c/c++'.gsub /\\n{1,}/, '\n'

在这种特殊情况下,“一个或多个”有它的语法糖:

#                                  ⇓
'Java \n\n c# \n\n c/c++'.gsub /\\n+/, '\n'

如果您使用的是Ruby2,则\R匹配可匹配\r\n的任意组合。

要消除恰好两个出现的情况,可以使用:

#                                  ⇓⇓⇓
'Java \n\n c# \n\n c/c++'.gsub /\\n{2}/, '\n'

最后,有一个函数可以使用named matches和反向引用从字符串中删除多个\n的出现:

def singlify s
  s.gsub /(?<sym>\\n)\g<sym>+/, '\k<sym>'
end

singlify 'Java \n\n c# \n\n c/c++'
# Java \n c# \n c/c++'

答案 2 :(得分:0)

'Java \n\n c# \n\n c/c++'.gsub! /\\n\\n/, '\n'