in reply to Re^4: A regex that only matches at offset that are multiples of a given N? (Update:almost perfect!)
in thread A regex that only matches at offset that are multiples of a given N?
that is effectively similar to simply ignoring non-aligned matched
How so? In johngg's regex, the decision which matches to select is made by the regex engine. Adding the manual pos() incrementation like so...
m{\G(?:.{$n})*?(?=(fred.*))(?{pos()+=$n})}g...would not change that, it would merely take care of the double-matching (if it works like I imagine).
The way I understand it, the double-matching is caused by the fact that the automatic pos() incrementation that happens between m/.../g matches will in this case not jump to the right of the last (fred.*) match, but instead to the left of it, because it is within a look-ahead which counts as zero-width. And so the next round matches the same (fred.*) again, since (?:.{$n})*? also matches the empty string.
It seems like it ought to be possible to reposition the \G somewhere after the (?:.{$n})
perlop says: "Note also that, currently, \G is only properly supported when anchored at the very beginning of the pattern.". So, apparently that's not possible.
every time I try to use \G. I conclude that I have just never managed to acquire a good mental model of what it actually does;
I think a good model is to look at it as the little brother of ^. Normally, a regex could match anywhere inside a string, but prefixing the regex with ^ forces its left end to "stick" to the beginning. Similarly, a repeated m/.../g match could normally match anywhere in the part of the string that is to the right of pos(), but prefixing it with \G forces its left end to stick to pos().
-----------
Edit: I tested it now, and embedding the pos()-advancing code in the regex itself like shown here does not work. However, putting it into the body of the while loop (see below) does.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^6: A regex that only matches at offset that are multiples of a given N? (Update:almost perfect!)
by BrowserUk (Patriarch) on Feb 13, 2013 at 20:11 UTC | |
by smls (Friar) on Feb 13, 2013 at 21:11 UTC | |
by BrowserUk (Patriarch) on Feb 13, 2013 at 23:12 UTC |