Letting RegExp method return something iterable?

Axel Rauschmayer axel at rauschma.de
Thu Aug 29 01:05:40 PDT 2013


I agree that execAll() is not a 100% winner, more like a clean-up of a quirky corner. But exec() in “multi” mode has a surprising amount of pitfalls:

* /g flag must be set
* lastIndex must be 0
* can’t inline the regex, because it is needed as a pseudo-iterator (more of an anti-pattern, anyway, but still)
* side effects via lastIndex may be a problem

All of these would go away with a execAll(). The thing I’m not sure about is how frequently exec() is used that way. String.prototype.match() does indeed cover a lot of use cases. So does String.prototype.replace().

On Aug 29, 2013, at 9:45 , Brendan Eich <brendan at mozilla.com> wrote:

> Axel Rauschmayer wrote:
>>> The fact that s.match(/re/g) returns the array of all matches (with captures) sucks some of the oxygen away from any /re/g.execAll(s) proposal.
>>> 
>>> But String.prototype.match has perlish hair (e.g., those capture groups showing up in the result array).
>> 
>> Really? AFAICT, only the complete matches (group 0) are returned.
>> 
> 
> Sorry, of course you are right -- how soon I forget -- the subgroups show up only in each exec result array, but are dropped from the match result.
> 
> So hair on the other side of the coin, if you will. A naive iterator that calls exec would return, e.g.,["ab", "b"] for the first iteration given r and s as follows:
> 
> js> r = /.(.)/g
> /.(.)/g
> js> s = 'abcdefgh'
> "abcdefgh"
> js> a = s.match(r)
> ["ab", "cd", "ef", "gh"]
> js> b = r.exec(s)
> ["ab", "b"]
> 
> Is this what the programmer wants? If not, String.prototype.match stands ready, and again takes away motivation for an eager execAll.
> 
> But programmers wanting exec with submatches could use a lazy form:
> 
> js> r.lastIndex = 0
> 0
> js> RegExp.prototype.execAll = function (s) { let m; while (m = this.exec(s)) yield m; }
> (function (s) { let m; while (m = this.exec(s)) yield m; })
> js> c = [m for (m of r.execAll(s))]
> [["ab", "b"], ["cd", "d"], ["ef", "f"], ["gh", "h"]]
> 
> /be
> 

-- 
Dr. Axel Rauschmayer
axel at rauschma.de

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20130829/17f4d1f2/attachment.html>


More information about the es-discuss mailing list