On May 28, 2009, at 10:15 AM, matt neuburg wrote:

> Li Chen <chen_li3 / yahoo.com> wrote:
>
>> I try #scan(pattern) but it doesn't return the
>> position for each match. I wonder how other handle this problem.
>
> It doesn't "return" the position but it does capture the position.
>
> s = 'ccccatgggctacatgggtcat'
> s.scan('cat') {puts Regexp.last_match.begin(0)}
>
> The last regex match is always hanging around waiting for you to ask
> about it.... Hope that helps - m.
>
> --  
> matt neuburg, phd = matt / tidbits.com, http://www.tidbits.com/matt/
> Leopard - http://www.takecontrolbooks.com/leopard-customizing.html
> AppleScript - http://www.amazon.com/gp/product/0596102119
> Read TidBITS! It's free and smart. http://www.tidbits.com

irb> s
=> "ccccatgggctacatgggtcat"
irb> pos = []
=> []
irb> while x = s.index('cat', (pos.last||-1)+1)
irb>   pos << x
irb>   end
=> nil
irb> pos
=> [3, 12, 19]

String#index is the way to go. The second arg is the position to start  
looking for a match. [].last==nil so it is a small trick to make the  
first loop test pass a 0 or 1 more than the previous match position.

-Rob


Rob Biedenharn		http://agileconsultingllc.com
Rob / AgileConsultingLLC.com