Multiple matches

Hi all,

How to find out pattern'cat' in this string='ccccatgggctacatgggtcat'
? There are three 'cat' within the string and I want to return the
position of each match.

Although # match return the match , #pre_match and #post_match do the
tricks but they only work for the first match. How about the 2nd, third
match, and more? I try #scan(pattern) but it doesn't return the
position for each match. I wonder how other handle this problem.

Thanks,

Li

···

--
Posted via http://www.ruby-forum.com/.

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.

···

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.

--
matt neuburg, phd = matt@tidbits.com, Matt Neuburg’s Home Page
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

How to find out pattern'cat' in this string='ccccatgggctacatgggtcat'
? There are three 'cat' within the string and I want to return the position of each match.

there is String#index.
there is no indexes, but you can build one if you like

eg,

s

=> "ccccatgggctacatgggtcat"

class String
def indexes str, n=0
n=index( str, n)
  if n
    [n] + indexes( str, n+=1)
  else
    
  end
end
end

=> nil

s.indexes "cat"

=> [3, 12, 19]

the faster way is to loop, but i just want to test my recursion skill :wink:

best regards
-botp

···

On Thu, May 28, 2009 at 9:34 PM, 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, Matt Neuburg’s Home Page
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

s

=> "ccccatgggctacatgggtcat"

pos =

=>

while x = s.index('cat', (pos.last||-1)+1)
  pos << x
  end

=> nil

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

···

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

Li Chen <chen_li3@yahoo.com> wrote: