替换"\n"而不是"\n \n"

Fly*_*ock 3 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"
Run Code Online (Sandbox Code Playgroud)

Yu *_*Hao 9

您可以使用正则表达式/(?<!\n)\n(?!\n)/,\n只有当它没有以前缀为前缀\n且未后跟a 时才匹配\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"
Run Code Online (Sandbox Code Playgroud)


Car*_*and 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"
Run Code Online (Sandbox Code Playgroud)

还有一个:

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" 
Run Code Online (Sandbox Code Playgroud)

在后一种方法中,将一个或多个连续换行符的每个字符串传递给散列.如果是单个换行符,"\n"则替换为h["\n"] #=> " \n".如果它是两个或多个换行符,比如说s = "\n\n",并且h没有等于s(初始它不会)的键,则键值对s=>s将被添加到h(因为为散列定义的默认值)s并将被替换为本身.