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