| | |
| | | var DESCRIPTORS = require('../internals/descriptors'); |
| | | var global = require('../internals/global'); |
| | | var uncurryThis = require('../internals/function-uncurry-this'); |
| | | var isForced = require('../internals/is-forced'); |
| | | var inheritIfRequired = require('../internals/inherit-if-required'); |
| | | var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); |
| | | var defineProperty = require('../internals/object-define-property').f; |
| | | var getOwnPropertyNames = require('../internals/object-get-own-property-names').f; |
| | | var isPrototypeOf = require('../internals/object-is-prototype-of'); |
| | | var isRegExp = require('../internals/is-regexp'); |
| | | var toString = require('../internals/to-string'); |
| | | var getFlags = require('../internals/regexp-flags'); |
| | | var getRegExpFlags = require('../internals/regexp-get-flags'); |
| | | var stickyHelpers = require('../internals/regexp-sticky-helpers'); |
| | | var redefine = require('../internals/redefine'); |
| | | var proxyAccessor = require('../internals/proxy-accessor'); |
| | | var defineBuiltIn = require('../internals/define-built-in'); |
| | | var fails = require('../internals/fails'); |
| | | var hasOwn = require('../internals/has-own-property'); |
| | | var enforceInternalState = require('../internals/internal-state').enforce; |
| | |
| | | var MATCH = wellKnownSymbol('match'); |
| | | var NativeRegExp = global.RegExp; |
| | | var RegExpPrototype = NativeRegExp.prototype; |
| | | var SyntaxError = global.SyntaxError; |
| | | var exec = uncurryThis(RegExpPrototype.exec); |
| | | var charAt = uncurryThis(''.charAt); |
| | | var replace = uncurryThis(''.replace); |
| | | var stringIndexOf = uncurryThis(''.indexOf); |
| | | var stringSlice = uncurryThis(''.slice); |
| | | // TODO: Use only propper RegExpIdentifierName |
| | | var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/; |
| | | var re1 = /a/g; |
| | |
| | | // "new" should create a new object, old webkit bug |
| | | var CORRECT_NEW = new NativeRegExp(re1) !== re1; |
| | | |
| | | var MISSED_STICKY = stickyHelpers.MISSED_STICKY; |
| | | var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y; |
| | | |
| | | var BASE_FORCED = DESCRIPTORS && |
| | | (!CORRECT_NEW || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () { |
| | | (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () { |
| | | re2[MATCH] = false; |
| | | // RegExp constructor can alter flags and IsRegExp works correct with @@match |
| | | return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i'; |
| | |
| | | var brackets = false; |
| | | var chr; |
| | | for (; index <= length; index++) { |
| | | chr = string.charAt(index); |
| | | chr = charAt(string, index); |
| | | if (chr === '\\') { |
| | | result += chr + string.charAt(++index); |
| | | result += chr + charAt(string, ++index); |
| | | continue; |
| | | } |
| | | if (!brackets && chr === '.') { |
| | |
| | | var groupname = ''; |
| | | var chr; |
| | | for (; index <= length; index++) { |
| | | chr = string.charAt(index); |
| | | chr = charAt(string, index); |
| | | if (chr === '\\') { |
| | | chr = chr + string.charAt(++index); |
| | | chr = chr + charAt(string, ++index); |
| | | } else if (chr === ']') { |
| | | brackets = false; |
| | | } else if (!brackets) switch (true) { |
| | |
| | | brackets = true; |
| | | break; |
| | | case chr === '(': |
| | | if (IS_NCG.test(string.slice(index + 1))) { |
| | | if (exec(IS_NCG, stringSlice(string, index + 1))) { |
| | | index += 2; |
| | | ncg = true; |
| | | } |
| | |
| | | throw new SyntaxError('Invalid capture group name'); |
| | | } |
| | | names[groupname] = true; |
| | | named.push([groupname, groupid]); |
| | | named[named.length] = [groupname, groupid]; |
| | | ncg = false; |
| | | groupname = ''; |
| | | continue; |
| | |
| | | // https://tc39.es/ecma262/#sec-regexp-constructor |
| | | if (isForced('RegExp', BASE_FORCED)) { |
| | | var RegExpWrapper = function RegExp(pattern, flags) { |
| | | var thisIsRegExp = this instanceof RegExpWrapper; |
| | | var thisIsRegExp = isPrototypeOf(RegExpPrototype, this); |
| | | var patternIsRegExp = isRegExp(pattern); |
| | | var flagsAreUndefined = flags === undefined; |
| | | var groups = []; |
| | |
| | | return pattern; |
| | | } |
| | | |
| | | if (patternIsRegExp || pattern instanceof RegExpWrapper) { |
| | | if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) { |
| | | pattern = pattern.source; |
| | | if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags.call(rawPattern); |
| | | if (flagsAreUndefined) flags = getRegExpFlags(rawPattern); |
| | | } |
| | | |
| | | pattern = pattern === undefined ? '' : toString(pattern); |
| | |
| | | rawPattern = pattern; |
| | | |
| | | if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) { |
| | | dotAll = !!flags && flags.indexOf('s') > -1; |
| | | if (dotAll) flags = flags.replace(/s/g, ''); |
| | | dotAll = !!flags && stringIndexOf(flags, 's') > -1; |
| | | if (dotAll) flags = replace(flags, /s/g, ''); |
| | | } |
| | | |
| | | rawFlags = flags; |
| | | |
| | | if (UNSUPPORTED_Y && 'sticky' in re1) { |
| | | sticky = !!flags && flags.indexOf('y') > -1; |
| | | if (sticky) flags = flags.replace(/y/g, ''); |
| | | if (MISSED_STICKY && 'sticky' in re1) { |
| | | sticky = !!flags && stringIndexOf(flags, 'y') > -1; |
| | | if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, ''); |
| | | } |
| | | |
| | | if (UNSUPPORTED_NCG) { |
| | |
| | | return result; |
| | | }; |
| | | |
| | | var proxy = function (key) { |
| | | key in RegExpWrapper || defineProperty(RegExpWrapper, key, { |
| | | configurable: true, |
| | | get: function () { return NativeRegExp[key]; }, |
| | | set: function (it) { NativeRegExp[key] = it; } |
| | | }); |
| | | }; |
| | | |
| | | for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) { |
| | | proxy(keys[index++]); |
| | | proxyAccessor(RegExpWrapper, NativeRegExp, keys[index++]); |
| | | } |
| | | |
| | | RegExpPrototype.constructor = RegExpWrapper; |
| | | RegExpWrapper.prototype = RegExpPrototype; |
| | | redefine(global, 'RegExp', RegExpWrapper); |
| | | defineBuiltIn(global, 'RegExp', RegExpWrapper, { constructor: true }); |
| | | } |
| | | |
| | | // https://tc39.es/ecma262/#sec-get-regexp-@@species |