multiple matches

L

Li Chen

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
 
M

matt neuburg

Li Chen said:
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.
 
R

Rob Biedenharn

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 = (e-mail address removed), 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
(e-mail address removed)
 
B

botp

How to find out pattern'cat' =A0in this string=3D'ccccatgggctacatgggtcat'
? There are three 'cat' within the string and I want to =A0return =A0the =
position of each match.

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

eg,
s =3D> "ccccatgggctacatgggtcat"
class String
def indexes str, n=3D0
n=3Dindex( str, n)
if n
[n] + indexes( str, n+=3D1)
else
[]
end
end
end =3D> nil
s.indexes "cat"
=3D> [3, 12, 19]

the faster way is to loop, but i just want to test my recursion skill ;)

best regards
-botp
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,139
Latest member
JamaalCald
Top