On Sun, Oct 23, 2011 at 10:41 AM, pete otaqui <[email protected]> wrote:
> Regular Expressions in Javascript don't make it easy to capture sub patterns
> when operating globally (i.e. using the 'g' modifier).
>
snip...
>
> So are we stuck? Do we need to use two separate string manipulation
> routines? No: we can use "replace" with a callback (and not do any actual
> replacing). Consider the following:
snip...
>
> We don't need to return anything from the callback, since neither are we
> assigning the return from string.replace to anything - but this is the only
> apparent method of looping through a global regexp with sub patterns.
Ok, I hope I'm reading your mail/question properly, but I think you're
trying to get all matches of a global regexp. If so, good news! It can
be done. If not, well, then please clarify your actual question or
hope somebody else does get it ;)
So regexp objects have this property called `lastIndex`. It's
basically only useful for global regexes, but will exist nonetheless.
The beauty about this property is that it's actually taken into
account when applying a global regexp to a string. Because it will
actually start matching at `lastIndex`. So rather than the replace
function (which is ok, unless you're doing some serious searching or
need to stop after n matches) you could just loop it through.
var match = null;
var matches = [];
var r = /(ab)b/g;
var s = 'aaabbabaaabbabababbaaabbab';
while (match = r.exec(s)) {
matches.push(match);
}
Oh and these match objects should have an `index` property that tell
you the start of the match. Of course this is a simple example where
it doesn't really make sense to actually save the matches like that,
but you probably want to apply it to a regex and string where the
results are not as predictable.
- peter
--
To view archived discussions from the original JSMentors Mailman list:
http://www.mail-archive.com/[email protected]/
To search via a non-Google archive, visit here:
http://www.mail-archive.com/[email protected]/
To unsubscribe from this group, send email to
[email protected]