You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.7 KiB
58 lines
1.7 KiB
'use strict'; |
|
|
|
var regexpFlags = require('./_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 LAST_INDEX = 'lastIndex'; |
|
|
|
var UPDATES_LAST_INDEX_WRONG = (function () { |
|
var re1 = /a/, |
|
re2 = /b*/g; |
|
nativeExec.call(re1, 'a'); |
|
nativeExec.call(re2, 'a'); |
|
return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 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[LAST_INDEX]; |
|
|
|
match = nativeExec.call(re, str); |
|
|
|
if (UPDATES_LAST_INDEX_WRONG && match) { |
|
re[LAST_INDEX] = 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 /(.?)?/ |
|
// eslint-disable-next-line no-loop-func |
|
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;
|
|
|