Edwin Fine wrote:
> Kenneth McDonald wrote:
>   
>> I'm probably just missing something obvious, but I haven't found a way
>> to match a regular expression against only part of a string, in
>> particular only past a certain point of a string, as a way of finding
>> successive matches. Of course, one could do a match against a string,
>> take the substring past that match and do a match against the substring,
>> and so on, to find all of the matches for the string, but that could be
>> very expensive for very large strings.
>>
>> I'm aware of the String.scan method, but that doesn't work for me
>> because it doesn't return MatchData instances.
>>
>> What I want is just something like regexp.match(string, n), where the
>> regexp starts looking for a match at or after position n in the string.
>>
>>
>> Thanks,
>> Ken
>>     
>
> How about this?
>
> def match(s, re, n)
>   /(?:.{#{n}})(#{re})/.match(s)
> end
>
> irb(main):043:0> p s
> "abdefgh abdefgh abdefgh abdefgh abdefgh abdefgh abdefgh abdefgh abdefgh 
> abdefgh "
> irb(main):044:0> p match(s, /abd/, 10).begin(1)
> 16
> irb(main):045:0> p match(s, /abd/, 20).begin(1)
> 24
>
>   
That's clever. Obscure, but clever :-). I wonder if the regexp engine is 
clever enough to turn a match like .{n} into a constant time operation?

Thanks,
Ken