From: timr Date: 2009-08-29T00:00:05+09:00 Subject: Re: I need a string#all_indices method--is there such a thing? On Aug 28, 2:01 am, Robert Dober wrote: > On Fri, Aug 28, 2009 at 10:25 AM, timr wrote: > > In ruby you can use string#index as follows: > > str = "some text" > > str.index(/t/) > > =>5 > > > But what if I want to get all the indices for a regex in the string? > > Is there an string#all_indices method? > > > I wrote the following, which works, but there must be a more elegant > > way: > > > class String > >  def all_indices(regex) > >  indices = [] > >  index = 0 > >    while index && index < self.length #index will be nil upon first > > match failure, otherwise quit loop when index is equal to string > > length > >      index = self.index(regex, index) > >      if index.is_a? Numeric   #avoids getting a nil into the indices > > array > >        indices << index > >        index +=1 > >      end > >    end > >    indices > >  end > > end > > p "this is a test string for the ts in the worldt".all_indices(/t/) > > p "what is up with all the twitter hype".all_indices(/w/) > > # >> [0, 10, 13, 16, 26, 30, 36, 45] > > # >> [0, 11, 25] > > What about > class String >   def indices rgx, idx=0 >     [].tap{ |r| >       loop do >         idx = index rgx, idx >         break unless idx >         r << idx >         idx += 1 >       end >     } >   end > end > > p "baaababbabbbba".indices( /a/ ) > > -- > If you tell the truth you don't have to remember anything. > -- > Samuel Clemens (some call him Mark Twain) Oh, tap is new in 1.9. Sorry, I hadn't come across it before and was in 1.8.6 so it wasn't running. Got it now.