From: Robert Dober Date: 2009-08-28T18:01:22+09:00 Subject: Re: I need a string#all_indices method--is there such a thing? 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)