替换“\n”但不替换“\n\n”

Replacing "\n" but not "\n\n"

如何将 "\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"

您可以使用正则表达式 /(?<!\n)\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"

这是另一种方式:

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 将被自身替换。

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

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"