55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
|
'use strict';
|
||
|
var regexpFlags = require('./regexp-flags');
|
||
|
|
||
|
var nativeExec = RegExp.prototype.exec;
|
||
|
// This always refers to the native implementation, because the
|
||
|
// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,
|
||
|
// which loads this file before patching the method.
|
||
|
var nativeReplace = String.prototype.replace;
|
||
|
|
||
|
var patchedExec = nativeExec;
|
||
|
|
||
|
var UPDATES_LAST_INDEX_WRONG = (function () {
|
||
|
var re1 = /a/;
|
||
|
var re2 = /b*/g;
|
||
|
nativeExec.call(re1, 'a');
|
||
|
nativeExec.call(re2, 'a');
|
||
|
return re1.lastIndex !== 0 || re2.lastIndex !== 0;
|
||
|
})();
|
||
|
|
||
|
// nonparticipating capturing group, copied from es5-shim's String#split patch.
|
||
|
var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
|
||
|
|
||
|
var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;
|
||
|
|
||
|
if (PATCH) {
|
||
|
patchedExec = function exec(str) {
|
||
|
var re = this;
|
||
|
var lastIndex, reCopy, match, i;
|
||
|
|
||
|
if (NPCG_INCLUDED) {
|
||
|
reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re));
|
||
|
}
|
||
|
if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
|
||
|
|
||
|
match = nativeExec.call(re, str);
|
||
|
|
||
|
if (UPDATES_LAST_INDEX_WRONG && match) {
|
||
|
re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
|
||
|
}
|
||
|
if (NPCG_INCLUDED && match && match.length > 1) {
|
||
|
// Fix browsers whose `exec` methods don't consistently return `undefined`
|
||
|
// for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
|
||
|
nativeReplace.call(match[0], reCopy, function () {
|
||
|
for (i = 1; i < arguments.length - 2; i++) {
|
||
|
if (arguments[i] === undefined) match[i] = undefined;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return match;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = patchedExec;
|