junk5 / microserf.org.uk wrote:
> Hi all
> 
> I have the string '1 20 3 400 5 60 7 800 9 0 ' and need to replace
> every n-th space in the string with another character. So if n=2 and
> the replacement character is '\n', then the above would become
> 
> '1 20\n3 400\n5 60\n7 800\n9 0\n'.
> 
> I'm sure it must be possible (easy, even) to do this with a regex
> substitution, but unfortunately I'm no regex ninja.
> 
> So far I have:
> 
> '1 20 3 400 5 60 7 800 9 0 '.sub(/(\d* \d* )/) {|s| s + "\n"}
> => "1 20 \n3 400 5 60 7 800 9 0 "
> 
> But how do I get the substitution to be 'repeated'? Changing the regexp
> to /(\d* \d*)*/ does not do what I want.
> 
> Also, I'm planning to run this on a large string, so I'd like it to be
> efficient if possible.
> 
> Thanks in advance
> 
> C

How about:

text = '1 20 3 400 5 60 7 800 9 0 '
n = 2
text.gsub!(/(\d+\s+){#{n-1}}(\d+)(\s+)/) { $1 + $2 + "\n" }

or completely different:

text = '1 20 3 400 5 60 7 800 9 0 '
n = 2
i = 0
text.gsub!(/\s+/) { |s| (i = (i+1) % n).zero? ? "\n" : s }

   Robin