Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A version of RegExp.prototype.exec() that returns an iterable
console.log(extractQuotedTextES5('“a” and “b” or “c”')); // [ 'a', 'b', 'c' ]
// If exec() is invoked on a regular expression whose flag /g is set
// then the regular expression is abused as an iterator:
// Its property `lastIndex` tracks how far along the iteration is
// and must be reset. It also means that the regular expression can’t be frozen.
var regexES5 = /(.*?)/g;
function extractQuotedTextES5(str) {
regexES5.lastIndex = 0; // to be safe
var results = [];
var match;
while (match = regexES5.exec(str)) {
results.push(match[1]);
}
return results;
}
// If we had a method `execAll()` that returns an iterable,
// the above code would become simpler in ES6.
const REGEX_ES6 = /(.*?)/; // no need to set flag /g
function extractQuotedTextES6a(str) {
let results = [];
for (let match of REGEX_ES6.execAll(str)) {
results.push(match[1]);
}
return results;
}
// Even shorter:
function extractQuotedTextES6b(str) {
return Array.from(REGEX_ES6.execAll(str), x => x[1]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment