如何用"\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"
答案 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"