On Aug 11, 2007, at 8:14 AM, dblack / rubypal.com wrote:

> Hi --
>
> On Sat, 11 Aug 2007, Andrew Savige wrote:
>
>> For a string "ZBBBCZZ", I want to produce a list ["Z", "BBB", "C",  
>> "ZZ"]
>> That is, break the string into pieces based on change of character.
>>
>> Though this works:
>>
>>  s = "ZBBBCZZ"
>>  x = s.scan(/((.)\2*)/).map {|i| i[0]}
>>
>> I'm new to Ruby and am interested to learn if there is a better  
>> way to
>> do it.
>
> Probably not better, but just for fun, here's a way using the strscan
> extension.  I'd be very interested if anyone can get this to be less
> clunky -- in particular, the - [""] at the end.
>
> require 'strscan'
> s = StringScanner.new("AABCCCDAAAEE")
>
> s.string.split(//).inject([]) {|a,b| a << s.scan_until(/(?!# 
> {b})/) } - [""]
>
> => ["AA", "B", "CCC", "D", "AAA", "EE"]

My best effort:

 >> require "strscan"
=> true
 >> scanner = StringScanner.new("ZBBBCZZ")
=> #<StringScanner 0/7 @ "ZBBBC...">
 >> char_runs = Array.new
=> []
 >> char_runs << scanner.matched while scanner.scan(/(.)\1*/m)
=> nil
 >> char_runs
=> ["Z", "BBB", "C", "ZZ"]

James Edward Gray II