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

How to replace "\n"

but not "\n\n"

etc. with help " \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"

      

+3


source to share


3 answers


You can use a regular expression /(?<!\n)\n(?!\n)/

that matches \n

only if it is not prefixed with something other \n

than with \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"

      

+9


source


Here's another way:

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"

      

and one more:



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" 

      

In the last method, each line of one or more consecutive newlines is passed into a hash. If it is one new line, it "\n"

is replaced with h["\n"] #=> " \n"

. If it has two or more newlines, for example s = "\n\n"

and h

does not have a key equal to s

(at first it won't), the key value pair s=>s

will be appended to h

(due to the default value defined for the hash) and s

will be replaced by itself ...

+6


source


Another solution you could use:

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"

      

+1


source







All Articles