es.string.match.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. 'use strict';
  2. var call = require('../internals/function-call');
  3. var uncurryThis = require('../internals/function-uncurry-this');
  4. var fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');
  5. var anObject = require('../internals/an-object');
  6. var isObject = require('../internals/is-object');
  7. var toLength = require('../internals/to-length');
  8. var toString = require('../internals/to-string');
  9. var requireObjectCoercible = require('../internals/require-object-coercible');
  10. var getMethod = require('../internals/get-method');
  11. var advanceStringIndex = require('../internals/advance-string-index');
  12. var getRegExpFlags = require('../internals/regexp-get-flags');
  13. var regExpExec = require('../internals/regexp-exec-abstract');
  14. var stringIndexOf = uncurryThis(''.indexOf);
  15. // @@match logic
  16. fixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {
  17. return [
  18. // `String.prototype.match` method
  19. // https://tc39.es/ecma262/#sec-string.prototype.match
  20. function match(regexp) {
  21. var O = requireObjectCoercible(this);
  22. var matcher = isObject(regexp) ? getMethod(regexp, MATCH) : undefined;
  23. return matcher ? call(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString(O));
  24. },
  25. // `RegExp.prototype[@@match]` method
  26. // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
  27. function (string) {
  28. var rx = anObject(this);
  29. var S = toString(string);
  30. var res = maybeCallNative(nativeMatch, rx, S);
  31. if (res.done) return res.value;
  32. var flags = toString(getRegExpFlags(rx));
  33. if (stringIndexOf(flags, 'g') === -1) return regExpExec(rx, S);
  34. var fullUnicode = stringIndexOf(flags, 'u') !== -1;
  35. rx.lastIndex = 0;
  36. var A = [];
  37. var n = 0;
  38. var result;
  39. while ((result = regExpExec(rx, S)) !== null) {
  40. var matchStr = toString(result[0]);
  41. A[n] = matchStr;
  42. if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
  43. n++;
  44. }
  45. return n === 0 ? null : A;
  46. }
  47. ];
  48. });