regex.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. function _export(target, all) {
  6. for(var name in all)Object.defineProperty(target, name, {
  7. enumerable: true,
  8. get: all[name]
  9. });
  10. }
  11. _export(exports, {
  12. pattern: function() {
  13. return pattern;
  14. },
  15. withoutCapturing: function() {
  16. return withoutCapturing;
  17. },
  18. any: function() {
  19. return any;
  20. },
  21. optional: function() {
  22. return optional;
  23. },
  24. zeroOrMore: function() {
  25. return zeroOrMore;
  26. },
  27. nestedBrackets: function() {
  28. return nestedBrackets;
  29. },
  30. escape: function() {
  31. return escape;
  32. }
  33. });
  34. const REGEX_SPECIAL = /[\\^$.*+?()[\]{}|]/g;
  35. const REGEX_HAS_SPECIAL = RegExp(REGEX_SPECIAL.source);
  36. /**
  37. * @param {string|RegExp|Array<string|RegExp>} source
  38. */ function toSource(source) {
  39. source = Array.isArray(source) ? source : [
  40. source
  41. ];
  42. source = source.map((item)=>item instanceof RegExp ? item.source : item);
  43. return source.join("");
  44. }
  45. function pattern(source) {
  46. return new RegExp(toSource(source), "g");
  47. }
  48. function withoutCapturing(source) {
  49. return new RegExp(`(?:${toSource(source)})`, "g");
  50. }
  51. function any(sources) {
  52. return `(?:${sources.map(toSource).join("|")})`;
  53. }
  54. function optional(source) {
  55. return `(?:${toSource(source)})?`;
  56. }
  57. function zeroOrMore(source) {
  58. return `(?:${toSource(source)})*`;
  59. }
  60. function nestedBrackets(open, close, depth = 1) {
  61. return withoutCapturing([
  62. escape(open),
  63. /[^\s]*/,
  64. depth === 1 ? `[^${escape(open)}${escape(close)}\s]*` : any([
  65. `[^${escape(open)}${escape(close)}\s]*`,
  66. nestedBrackets(open, close, depth - 1)
  67. ]),
  68. /[^\s]*/,
  69. escape(close)
  70. ]);
  71. }
  72. function escape(string) {
  73. return string && REGEX_HAS_SPECIAL.test(string) ? string.replace(REGEX_SPECIAL, "\\$&") : string || "";
  74. }