如何更换"\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)
您可以使用正则表达式/(?<!\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)
这是另一种方式:
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并将被替换为本身.