define("regex", () => { var RegExp = env.global.RegExp = env.internals.RegExp; setProps(RegExp.prototype as RegExp, env, { [Symbol.typeName]: 'RegExp', test(val) { return !!this.exec(val); }, toString() { return '/' + this.source + '/' + this.flags; }, [Symbol.match](target) { if (this.global) { const res: string[] = []; let val; while (val = this.exec(target)) { res.push(val[0]); } this.lastIndex = 0; return res; } else { const res = this.exec(target); if (!this.sticky) this.lastIndex = 0; return res; } }, [Symbol.matchAll](target) { let pattern: RegExp | undefined = new this.constructor(this, this.flags + "g") as RegExp; return { next: (): IteratorResult => { const val = pattern?.exec(target); if (val === null || val === undefined) { pattern = undefined; return { done: true }; } else return { value: val }; }, [Symbol.iterator]() { return this; } } }, [Symbol.split](target, limit, sensible) { const pattern = new this.constructor(this, this.flags + "g") as RegExp; let match: RegExpResult | null; let lastEnd = 0; const res: string[] = []; while ((match = pattern.exec(target)) !== null) { let added: string[] = []; if (match.index >= target.length) break; if (match[0].length === 0) { added = [ target.substring(lastEnd, pattern.lastIndex), ]; if (pattern.lastIndex < target.length) added.push(...match.slice(1)); } else if (match.index - lastEnd > 0) { added = [ target.substring(lastEnd, match.index), ...match.slice(1) ]; } else { for (let i = 1; i < match.length; i++) { res[res.length - match.length + i] = match[i]; } } if (sensible) { if (limit !== undefined && res.length + added.length >= limit) break; else res.push(...added); } else { for (let i = 0; i < added.length; i++) { if (limit !== undefined && res.length >= limit) return res; else res.push(added[i]); } } lastEnd = pattern.lastIndex; } if (lastEnd < target.length) { res.push(target.substring(lastEnd)); } return res; }, [Symbol.replace](target, replacement) { const pattern = new this.constructor(this, this.flags + "d") as RegExp; let match: RegExpResult | null; let lastEnd = 0; const res: string[] = []; // log(pattern.toString()); while ((match = pattern.exec(target)) !== null) { const indices = match.indices![0]; res.push(target.substring(lastEnd, indices[0])); if (replacement instanceof Function) { res.push(replacement(target.substring(indices[0], indices[1]), ...match.slice(1), indices[0], target)); } else { res.push(replacement); } lastEnd = indices[1]; if (!pattern.global) break; } if (lastEnd < target.length) { res.push(target.substring(lastEnd)); } return res.join(''); }, [Symbol.search](target, reverse, start) { const pattern: RegExp | undefined = new this.constructor(this, this.flags + "g") as RegExp; if (!reverse) { pattern.lastIndex = (start as any) | 0; const res = pattern.exec(target); if (res) return res.index; else return -1; } else { start ??= target.length; start |= 0; let res: RegExpResult | null = null; while (true) { const tmp = pattern.exec(target); if (tmp === null || tmp.index > start) break; res = tmp; } if (res && res.index <= start) return res.index; else return -1; } }, }); });