From: Kenneth McDonald Date: 2007-06-03T14:20:54+09:00 Subject: Re: No way of looking for a regrexp match starting from a pa 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