替换" \ n"但不是" \ n \ n"

时间:2015-04-24 02:14:04

标签: ruby gsub

如何用"\n"替换"\n\n"而不是" \n"等?

text1 = "Hello\nWorld"
text1.sub! "\n", "  \n"
=> "Hello  \nWorld"

text2 = "Hello\n\nWorld"
text2.sub! "\n\n", "  \n"
=> "Hello  \n\nWorld"
SHOULD BE: => "Hello\n\nWorld"

3 个答案:

答案 0 :(得分:9)

您可以使用正则表达式/(?<!\n)\n(?!\n)/,该正则表达式仅在\n\n没有前缀而后跟\n后才匹配text1 = "Hello\nWorld" # => "Hello\nWorld" text1.sub /(?<!\n)\n(?!\n)/, " \n" # => "Hello \nWorld" text2 = "Hello\n\nWorld" # => "Hello\n\nWorld" text2.sub /(?<!\n)\n(?!\n)/, " \n" # => "Hello\n\nWorld"

{{1}}

答案 1 :(得分:6)

这是另一种方式:

r = /\n+/

"Hello\nWorld".sub(r) { |s| (s.size==1) ? " \n" : s }
  #=> "Hello  \nWorld"

"Hello\n\nWorld".sub(r) { |s| (s.size==1) ? " \n" : s }
  #=> "Hello\n\nWorld"

还有一个:

h = Hash.new { |h,k| h[k] = k }.update("\n"=>"  \n")
  #=> {"\n"=>"  \n"}

"Hello\nWorld".sub(r,h)
   #=> "Hello  \nWorld" 
"Hello\n\nWorld".sub(r,h)
   #=> "Hello\n\nWorld" 

在后一种方法中,将一个或多个连续换行符的每个字符串传递给散列。如果它是一个换行符,"\n"将替换为h["\n"] #=> " \n"。如果它有两个或更多新行,例如s = "\n\n"h没有等于s的密钥(最初它赢了),键值对s=>s将添加到h(因为为哈希定义了默认值),s将被其自身替换。

答案 2 :(得分:1)

您可以使用的另一种解决方案:

string = "Hello\nWorld"
string.split("\n") == string.split("\n").reject(&:empty?) ? string.sub!("\n", " \n") : string
  #=> "Hello \nWorld"

string = "Hello\n\nWorld"
string.split("\n") == string.split("\n").reject(&:empty?) ? string.sub!("\n", " \n") : string
  #=> "Hello\n\nWorld"