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