type UppercaseLetter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; type LowercaseLetter = 'abcdefghijklmnopqrstuvwxyz'; type Digit = '0123456789'; type Alphanumeric = `_${Digit}${UppercaseLetter}${LowercaseLetter}`; type Whitespace = ` \f\n\r\t\v\u00a0\u1680\u2000\u200a\u2028\u2029\u202f\u205f\u3000\ufeff`; type CommonChar = `!"#$%&'()*+,-./${Digit}:;<=>?@${UppercaseLetter}[\\]^_\`${LowercaseLetter}{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψω`; type CaseMap = { a: 'A'; b: 'B'; c: 'C'; d: 'D'; e: 'E'; f: 'F'; g: 'G'; h: 'H'; i: 'I'; j: 'J'; k: 'K'; l: 'L'; m: 'M'; n: 'N'; o: 'O'; p: 'P'; q: 'Q'; r: 'R'; s: 'S'; t: 'T'; u: 'U'; v: 'V'; w: 'W'; x: 'X'; y: 'Y'; z: 'Z'; A: 'a'; B: 'b'; C: 'c'; D: 'd'; E: 'e'; F: 'f'; G: 'g'; H: 'h'; I: 'i'; J: 'j'; K: 'k'; L: 'l'; M: 'm'; N: 'n'; O: 'o'; P: 'p'; Q: 'q'; R: 'r'; S: 's'; T: 't'; U: 'u'; V: 'v'; W: 'w'; X: 'x'; Y: 'y'; Z: 'z'; }; interface CharSetMap> { step: CharSet; whitespace: Whitespace; nonWhitespace: Whitespace; char: Alphanumeric; nonChar: Alphanumeric; digit: Digit; nonDigit: Digit; charSet: ResolvedCharSet; notCharSet: ResolvedCharSet; boundary: string; nonBoundary: string; } type InvertCharSetMap = { any: 'any'; whitespace: 'nonWhitespace'; nonWhitespace: 'whitespace'; char: 'nonChar'; nonChar: 'char'; digit: 'nonDigit'; nonDigit: 'digit'; charSet: 'notCharSet'; notCharSet: 'charSet'; }; type ResolveCharSet = CharSet extends `${infer Before}-${infer To}${infer Rest}` ? LastCharOfOr extends infer From extends string ? Before extends `${infer Set}${From}` ? ResolveCharSet}`> : never : never : `${Result}${CharSet}`; type ResolveRangeSet = CommonChar extends `${string}${From}${infer Between}${To}${string}` ? `${From}${Between}${To}` : 'invalid range'; type Matcher = { type: 'string' | 'charSet' | 'notCharSet' | 'backreference'; value: string; } | { type: 'any' | Exclude | 'endMark' | 'debug'; } | { type: 'capture' | 'startOf' | 'endOf' | 'captureLast' | 'not'; value: Matcher[]; } | { type: 'optional'; value: Matcher[]; greedy: boolean; repeat?: [from: any[], to: string]; } | { type: 'zeroOrMore' | 'oneOrMore'; value: Matcher[]; greedy: boolean; } | { type: 'namedCapture'; value: Matcher[]; name: string; } | { type: 'lookahead' | 'lookbehind'; value: Matcher[]; positive: boolean; } | { type: 'repeat'; value: Matcher[]; from: `${number}`; to: `${number}` | '' | string; greedy: boolean; } | { type: 'or'; value: Matcher[][]; }; type NamedCapturesTuple = [any, string | undefined]; interface MatchedResult { matched: true; results: MatchedArray; namedCaptures: NamedCaptures; restInputString: RestInputString; } interface NullResult { matched: false; results: null; partialMatched: PartialMatched; abort: Abort; debugObj: DebugObj; } type LengthOfString = Length extends 990 ? number : String extends `${string}${infer R}` ? LengthOfString : Length; type ConcatParialMatched ? Partial : never> = `${PartialMatched}${NestedPartialMatched}`; type ConcatToFirstElement = Arr extends [infer First extends string, ...infer Rest] ? [`${First}${AppendingString}`, ...Rest] : []; type IndexOf = Array extends [ infer First, ...infer Rest ] ? Item extends First ? Count : IndexOf : never; type LastCharOfOr = InputString extends `${infer First}${infer Rest}` ? Rest extends '' ? First : LastCharOfOr : Or; type StringToUnion = Count['length'] extends 13 ? `[ any char in [${Original}] ]` : S extends `${infer Char}${infer Rest}` ? StringToUnion : Union; type SliceMatchers = Start['length'] extends Matchers['length'] ? Result : SliceMatchers; type TupleItemExtendsType = Tuple[Index['length']] extends TargetType ? true : false; type Flatten = Source extends [infer X, ...infer Y] ? X extends any[] ? Flatten<[...X, ...Y], Result> : Flatten<[...Y], [...Result, X]> : Result; type CountNumOfCaptureGroupsAs = Matchers extends [] ? Count : Matchers extends [infer CurrentMatcher, ...infer RestMatchers extends Matcher[]] ? CurrentMatcher extends { type: infer Type; value: infer NestedMatchers extends Matcher[]; } ? CountNumOfCaptureGroupsAs, ...(Type extends 'capture' | 'namedCapture' ? [As] : []) ]> : CurrentMatcher extends { type: infer Type; value: infer ArrayOfNestedMatchers extends Matcher[][]; } ? CountNumOfCaptureGroupsAs>, ...(Type extends 'capture' | 'namedCapture' ? [As] : []) ]> : CountNumOfCaptureGroupsAs : never; type ResolveOrCaptureTuple = AllPossibleMatchers extends [] ? ResultTuple : AllPossibleMatchers extends [ infer CurrentMatchers extends Matcher[], ...infer RestPossibleMatchers extends Matcher[][] ] ? Index['length'] extends CapturedIndex['length'] ? ResolveOrCaptureTuple : ResolveOrCaptureTuple ]> : never; type CollectCaptureNames = Matchers extends [] ? Names : Matchers extends [infer CurrentMatcher, ...infer RestMatchers extends Matcher[]] ? CurrentMatcher extends { value: infer NestedMatchers extends Matcher[]; } ? CollectCaptureNames : never | CollectCaptureNames> : CurrentMatcher extends { value: infer NestedMatchersArray extends Matcher[][]; } ? CollectCaptureNames[0]> : CollectCaptureNames : never; type ResolveNamedCaptureUnion = AllPossibleMatchers extends [] ? [CollectedNames] extends [never] ? PreviousNamedCaptures : Exclude extends infer UndefinedCaptureNames ? PreviousNamedCaptures | Exclude<[UndefinedCaptureNames, undefined], [never, undefined]> : never : AllPossibleMatchers extends [ infer CurrentMatchers extends Matcher[], ...infer RestPossibleMatchers extends Matcher[][] ] ? ResolveNamedCaptureUnion> : never; type DeepMatchersIncludeType = Count['length'] extends Matchers['length'] ? false : CurrentMatcher extends { type: Type; } ? true : CurrentMatcher extends { value: infer NestMatchers extends Matcher[]; } ? DeepMatchersIncludeType : CurrentMatcher extends { value: infer NestOrMatchers extends Matcher[][]; } ? Extract, true> extends never ? false : true : false; type StepMatch = MatchingType extends 'step' ? InputString extends `${infer FirstChar}${infer Rest}` ? MatchingString extends `${infer FirstMatchingChar}${infer MatchingRest}` ? FirstChar extends FirstMatchingChar | (CaseInsensitive extends true ? FirstMatchingChar extends keyof CaseMap ? CaseMap[FirstMatchingChar] : never : never) ? StepMatch : StartOf extends true ? NullResult<''> : InputString extends `${string}${infer Rest}` ? StepMatch : NullResult<''> : AccMatchedString extends '' ? NullResult<''> : MatchedResult<[AccMatchedString], InputString> : AccMatchedString extends '' ? NullResult<''> : MatchedResult<[AccMatchedString], ''> : MatchingType extends 'string' ? InputString extends `${infer Matched extends MatchingString}${infer Rest}` ? MatchedResult<[Matched], Rest> : StartOf extends true ? NullResult<''> : InputString extends `${string}${infer Rest}` ? StepMatch : NullResult<''> : MatchingType extends 'boundary' | 'nonBoundary' ? InputString extends `${infer First}${infer Second}${infer Rest}` ? { o: NullResult<''>; r: NullResult<''>; } extends { o: StepMatch; r: StepMatch; } ? MatchedResult<[''], `${Second}${Rest}`> : MatchingType extends 'nonBoundary' ? MatchedResult<[''], `${Second}${Rest}`> : StartOf extends true ? NullResult<''> : StepMatch<`${Second}${Rest}`, MatchingString, StartOf, MatchingType, CaseInsensitive> : NullResult<''> : InputString extends `${infer FirstChar}${infer Rest}` ? MatchingString extends `${string}${FirstChar | (CaseInsensitive extends true ? FirstChar extends keyof CaseMap ? CaseMap[FirstChar] : never : never)}${string}` ? MatchingType extends 'notCharSet' | 'nonChar' | 'nonDigit' | 'nonWhitespace' ? StartOf extends true ? NullResult<''> : StepMatch : MatchedResult<[FirstChar], Rest> : MatchingType extends 'notCharSet' | 'nonChar' | 'nonDigit' | 'nonWhitespace' ? MatchedResult<[FirstChar], Rest> : StartOf extends true ? NullResult<''> : StepMatch : NullResult<''>; type NameCaptureValue[1]> = Value; type ExpandOneOrMore = [ { type: 'captureLast'; value: Matchers; }, { type: 'captureLast'; value: [ { type: 'zeroOrMore'; greedy: Greedy; value: Matchers; } ]; } ]; type ExpandRepeat = Count['length'] extends 201 ? [] : To extends `${Count['length']}` ? ExpandedMatchers : From extends `${Count['length']}` ? string extends To ? ExpandedMatchers : To extends '' ? [ ...ExpandedMatchers, { type: 'captureLast'; value: [ { type: 'zeroOrMore'; greedy: Greedy; value: Matchers; } ]; } ] : ExpandRepeat : LargerThanFrom extends true ? ExpandedMatchers : ExpandRepeat; type RestMatchersBeforeBackReference = Index['length'] extends Matchers['length'] ? ResultMatchers extends infer R extends Matcher[] ? R : never : DeepMatchersIncludeType<[Matchers[Index['length']]], 'backreference'> extends true ? ResultMatchers extends infer R extends Matcher[] ? R : never : RestMatchersBeforeBackReference; type FlattenLookahead = Count['length'] extends Matchers['length'] ? FlattenMatchers : CurrentMatcer extends { type: 'or'; value: infer NestedArrMatchers extends Matcher[][]; } ? FlattenLookahead; }; } ], [ ...Count, '' ]> : CurrentMatcer extends { type: 'lookahead'; value: infer NestedMatchers extends Matcher[]; positive: infer Positive extends boolean; } ? FlattenLookahead extends infer FlattenNestedMatchers extends Matcher[] ? Positive extends false ? FlattenLookahead : FlattenLookahead : never : CurrentMatcer extends { type: 'capture'; value: infer NestedMatchers extends Matcher[]; } ? FlattenLookahead extends infer FlattenNestedMatchers extends Matcher[] ? FlattenLookahead : never : [ReduceOrMoreMatcher, CurrentMatcer] extends [ true, { type: infer Type extends 'zeroOrMore' | 'oneOrMore'; value: infer NestedMatchers extends [ { type: keyof InvertCharSetMap; value?: string; } ]; } ] ? NestedMatchers extends Matcher[] ? FlattenLookahead : never : FlattenLookahead; type ShorthandMap = { s: 'whitespace'; S: 'nonWhitespace'; w: 'char'; W: 'nonChar'; d: 'digit'; D: 'nonDigit'; b: 'boundary'; B: 'nonBoundary'; }; type IgnoreEscapedChar = { '0': '\0'; t: '\t'; v: '\v'; r: '\r'; n: '\n'; f: '\f'; }; type RegExpSyntaxError = { type: 'RegExpSyntaxError'; message: Msg; } & SyntaxError; type ParseRegExp = InputString extends `${infer FirstChar}${infer Rest}` ? FirstChar extends '.' ? Rest extends `${'?' | '*' | '+' | '{'}${string}` ? ResolveQuantifierForSingleToken<[ { type: 'any'; } ], Rest, ParsedMatchers, AccString, ParseOrAsTupleOnly> : ParseRegExp, { type: 'any'; } ], ParseOrAsTupleOnly> : FirstChar extends '^' ? ParseRegExp extends infer StarOfInnerMatchersOrError ? StarOfInnerMatchersOrError extends RegExpSyntaxError ? StarOfInnerMatchersOrError : [{ type: 'startOf'; value: StarOfInnerMatchersOrError; }] : never : FirstChar extends '$' ? [ { type: 'endOf'; value: [...ParsedMatchers, ...ResolvesAccStringMatcher]; } ] : FirstChar extends '\\' ? Rest extends `k<${infer GroupName}>${infer RestAfterBackreference}` ? RestAfterBackreference extends `${'?' | '*' | '+' | '{'}${string}` ? ResolveQuantifierForSingleToken<[ { type: 'backreference'; value: GroupName; } ], RestAfterBackreference, ParsedMatchers, AccString, ParseOrAsTupleOnly> : ParseRegExp, { type: 'backreference'; value: GroupName; } ], ParseOrAsTupleOnly> : Rest extends `${infer EscapedChar}${infer RestAfterEscapedChar}` ? EscapedChar extends keyof IgnoreEscapedChar ? ParseRegExp : EscapedChar extends keyof ShorthandMap ? RestAfterEscapedChar extends `${'?' | '*' | '+' | '{'}${string}` ? ResolveQuantifierForSingleToken<[ { type: ShorthandMap[EscapedChar]; } ], RestAfterEscapedChar, ParsedMatchers, AccString, ParseOrAsTupleOnly> : ParseRegExp, { type: ShorthandMap[EscapedChar]; } ], ParseOrAsTupleOnly> : ParseRegExp : never : FirstChar extends '|' ? ParseOrAsTupleOnly extends true ? ParseRegExp extends infer RestOrMatchersTuple ? [ [ ...ParsedMatchers, ...ResolvesAccStringMatcher ] extends infer CurrentOrMatchersTuple ? CurrentOrMatchersTuple extends [] ? [{ type: 'string'; value: ''; }] : CurrentOrMatchersTuple : never, ...(RestOrMatchersTuple extends Matcher[][] ? RestOrMatchersTuple extends [] ? [[{ type: 'string'; value: ''; }]] : RestOrMatchersTuple : [RestOrMatchersTuple]) ] : never : ParseRegExp extends infer RestOrMatchersTuple ? [ { type: 'or'; value: [ [ ...ParsedMatchers, ...ResolvesAccStringMatcher ] extends infer CurrentOrMatchersTuple ? CurrentOrMatchersTuple extends [] ? [{ type: 'string'; value: ''; }] : CurrentOrMatchersTuple : never, ...(RestOrMatchersTuple extends Matcher[][] ? RestOrMatchersTuple extends [] ? [[{ type: 'string'; value: ''; }]] : RestOrMatchersTuple : [RestOrMatchersTuple]) ]; } ] : never : FirstChar extends '[' ? ParsePair extends infer ParsePairResult ? ParsePairResult extends RegExpSyntaxError ? ParsePairResult : ParsePairResult extends [ `${infer SetFirstChar}${infer RestAfterSetFirstChar}`, infer Rest extends string ] ? Rest extends `${'?' | '*' | '+' | '{'}${string}` ? ResolveQuantifierForSingleToken<[ { type: SetFirstChar extends '^' ? 'notCharSet' : 'charSet'; value: SetFirstChar extends '^' ? RestAfterSetFirstChar : `${SetFirstChar}${RestAfterSetFirstChar}`; } ], Rest, ParsedMatchers, AccString, ParseOrAsTupleOnly> : ParseRegExp, { type: SetFirstChar extends '^' ? 'notCharSet' : 'charSet'; value: SetFirstChar extends '^' ? RestAfterSetFirstChar : `${SetFirstChar}${RestAfterSetFirstChar}`; } ], ParseOrAsTupleOnly> : never : never : FirstChar extends '(' ? ParsePair extends infer ParsePairResult ? ParsePairResult extends RegExpSyntaxError ? ParsePairResult : ParsePairResult extends [ InnerResult, RestResult ] ? ParseRegExp extends infer ParsedInnerResult ? ParsedInnerResult extends Matcher[] ? ParseRegExp, ...ResolveQuantifierTypeMatcher> ], ParseOrAsTupleOnly> : ParsedInnerResult : never : never : never : Rest extends `${'?' | '*' | '+' | '{'}${string}` ? ResolveQuantifierForSingleToken<[ { type: 'string'; value: FirstChar; } ], Rest, ParsedMatchers, AccString, ParseOrAsTupleOnly> : InputString extends `${'*' | '+'}${string}` | `{${number}${'' | ',' | `,${number}`}}${string}` ? [{ type: never; }, ...ParsedMatchers][ParsedMatchers['length']]['type'] extends 'optional' | 'zeroOrMore' | 'oneOrMore' | 'repeat' ? RegExpSyntaxError<`Invalid regular expression, the preceding token to ${[ FirstChar, Rest ] extends ['{', `${infer Repeat}}${string}`] ? `{${Repeat}}` : FirstChar} is not quantifiable`> : never : FirstChar extends ')' ? RegExpSyntaxError<`Invalid regular expression, missing opening \`(\``> : ParseRegExp : [...ParsedMatchers, ...ResolvesAccStringMatcher]; type ResolvesAccStringMatcher = AccString extends '' ? [] : [{ type: 'string'; value: AccString; }]; type ResolveQuantifierForSingleToken = Rest extends `${infer Quantifier extends '?' | '*' | '+'}${infer RestAfterQuantifier}` ? ParseRegExp, ...ResolveQuantifierTypeMatcher ], ParseOrAsTupleOnly> : Rest extends `{${infer RpeatQuantifierWRest}` ? ParsePair<'{', RpeatQuantifierWRest> extends [ infer RepeatInner extends string, infer RestAfterRepeat extends string ] ? RepeatInner extends '{' ? ParseRegExp<`{${RestAfterRepeat}`, [ ...ParsedMatchers, ...ResolvesAccStringMatcher, ...CurrentTokenResolvedMatchers ], ParseOrAsTupleOnly> : ParseRegExp, ...ResolveQuantifierTypeMatcher<'repeat', RestAfterRepeat extends `?${string}` ? false : true, `{${RepeatInner}}` extends `{${infer From}${'' | `,${infer To}`}}` ? [Extract, To] : undefined, CurrentTokenResolvedMatchers> ], ParseOrAsTupleOnly> : never : never; type ResolveQuantifierTypeMatcher = Quantifier extends undefined ? QuantifyPattern : Quantifier extends 'optional' | 'zeroOrMore' | 'oneOrMore' ? [ { type: Quantifier; greedy: Greedy; value: QuantifyPattern; } ] : [Quantifier, Repeat] extends [ 'repeat', [ infer From extends `${number}`, infer To extends `${number}` | '' | string ] ] ? [ { type: Quantifier; greedy: Greedy; from: From; to: To; value: QuantifyPattern; } ] : never; type ResolveEncloseTypeMatcher = Type extends 'capture' ? [ { type: Type; value: ResovledInner; } ] : Type extends 'namedCapture' ? [ { type: Type; name: positiveOrName extends string ? positiveOrName : never; value: ResovledInner; } ] : Type extends 'lookahead' | 'lookbehind' ? [ { type: Type; positive: positiveOrName extends boolean ? positiveOrName : never; value: ResovledInner; } ] : ResovledInner; type CloseBracketMap = { '(': ')'; '[': ']'; '{': '}'; }; type ParsePair = InputRest extends `${infer Inner}${OpenBracket | CloseBracketMap[OpenBracket]}${string}` ? true extends Extract ? InputRest extends `${infer Inner}${OpenBracket}${infer InnerAfterOpenBracket}` ? ParsePair : never : InputRest extends `${infer Inner}${CloseBracketMap[OpenBracket]}${infer InnerAfterCloseBracket}` ? Inner extends `${string}\\` ? ParsePair : [...CloseBracketCount, '']['length'] extends OpenBracketCount['length'] ? OpenBracket extends '[' ? [`${ResolvedInner}${Inner}`, InnerAfterCloseBracket] : OpenBracket extends '{' ? `${ResolvedInner}${Inner}` extends `${number}` | `${number},${number}` | `${number},` ? [`${ResolvedInner}${Inner}`, InnerAfterCloseBracket] : ['{', `${ResolvedInner}${InputRest}`] : ResolveInner<`${ResolvedInner}${Inner}`> extends infer ResolvedInner ? ResolvedInner extends InnerResult ? [ResolvedInner, ResolveRest] : ResolvedInner : never : ParsePair : never : OpenBracket extends '{' ? ['{', `${ResolvedInner}${InputRest}`] : RegExpSyntaxError<`Invalid regular expression, missing closing \`${CloseBracketMap[OpenBracket]}\``>; type InnerResult = { resovledInner: ResolvedInner; type: Type; }; type ResolveInner = Inner extends `?<${infer CaptureType extends '=' | '!'}${infer InnerAferLookBehind}` ? InnerResult : InnerResult : RegExpSyntaxError<`Invalid regular expression, invalid capture group name of \`${InnerIncludeClosingBracket}\`, possibly due to a missing closing '>' for group name`> : Inner extends `?${string}>${infer SyntaxErrorInner}` ? RegExpSyntaxError<`Invalid regular expression, invalid capture group name for capturing \`${SyntaxErrorInner}\`, possibly due to a missing opening '<' and group name`> : InnerResult; type RestResult = { resovledRest: ResolvedRest; quantifier: Quantifier; }; type QuantifierMap = { '?': 'optional'; '*': 'zeroOrMore'; '+': 'oneOrMore'; }; type ResolveRest = Rest extends `${infer Quantifier extends '?' | '*' | '+'}${infer RestAfterQuantifier}` ? RestResult : Rest extends `{${infer RpeatOpWRest}` ? ParsePair<'{', RpeatOpWRest> extends [ infer RepeatInner extends string, infer RestAfterRepeat extends string ] ? RepeatInner extends '{' ? RestResult : RestResult, To] : undefined ]> : never : RestResult; type GlobalMatch = ExhaustiveMatch extends infer Result ? Result extends MatchedResult ? GlobalMatch : MatchResultArray extends [] ? null : MatchResultArray : never; type ExhaustiveMatch = Matchers extends Matchers ? EnumerateMatchers extends infer Result ? Result extends MatchedResult ? Result : Result extends NullResult ? true extends Abort | StartOf ? Result : PartialMatched extends '' ? InputString extends `${infer FirstChar}${infer Rest}` ? Rest extends '' ? Result : ExhaustiveMatch : Result : InputString extends `${infer Prefix}${PartialMatched}${infer NextSection}` ? ExhaustiveMatch : never : never : never : never; type MatchLast | NullResult<''> = NullResult<''>> = EnumerateMatchers extends infer Result ? Result extends MatchedResult<[ infer CurrentMatch extends string, ...any[] ], infer RestInput, any> ? `${CurrentMatch}${RestInput}` extends '' ? MatchedResult<[''], ''> : StepChar extends true ? InputString extends `${infer Skipped}${CurrentMatch}${RestInput}` ? Match<`${SkippedString}${Skipped}`, Flags, '', '', [ InvertMatcher ], [ ], never, false> extends NullResult ? InputString extends `${infer SkippedChar}${infer Rest}` ? MatchLast : MatchedResult<[''], '', never> : LastMatched : never : MatchLast : Result extends NullResult ? PartialMatched extends '' ? false extends StepChar | (InputString extends '' ? false : true) ? LastMatched : InputString extends `${infer Skipped}${infer Rest}` ? MatchLast : LastMatched : InputString extends `${infer Skipped}${PartialMatched}${infer NextSeg}` ? MatchLast : LastMatched : never : never; type EnumerateMatchers, any]> : NamedCaptures> = Count['length'] extends Matchers['length'] ? MatchedResult : CurrentMatcher extends { type: infer Type extends 'endOf' | 'startOf'; value: infer StartOrEndMatchers extends Matcher[]; } ? ExhaustiveMatch extends infer Result ? Result extends MatchedResult ? '' extends (Type extends 'endOf' ? false : '') | RestInputString ? Result : NullResult : Result extends NullResult ? NullResult : never : never : Match}${InputString}` : InputString, Flags, NonNullable, SkippedString, Matchers, OutMostRestMatchers, ResolvedNamedCaptures, StartOf, Count> extends infer Result ? Result extends MatchedResult<[ infer CurrentMatched extends string, ...infer CurrentMatchedRestArray extends any[] ], infer RestInputString, infer NestNamedCaptures> ? EnumerateMatchers), ...(CurrentMatcher['type'] extends 'capture' | 'namedCapture' ? [CurrentMatched] : []), ...([CurrentMatcher['type'], CurrentMatched] extends ['captureLast', ''] ? [] : CurrentMatchedRestArray) ], (CurrentMatcher extends { type: 'namedCapture'; name: infer CaptureName extends string; } ? [CaptureName, CurrentMatched] : never) | ([CurrentMatcher['type'], CurrentMatched] extends ['captureLast', ''] ? NamedCaptures : ResolvedNamedCaptures | NestNamedCaptures), true, // ? Allway set startOf to `true` for following matchs [ ...Count, '' ]> : NullResult, Result extends NullResult ? Result['debugObj'] : unknown, false> : never; type Match extends infer RM extends Matcher[] ? RM : never> = CurrentMatcher extends { type: 'any'; } ? InputString extends `${infer AnyChar}${infer Rest}` ? MatchedResult<[AnyChar], Rest> : NullResult : CurrentMatcher extends { type: infer Type extends 'string' | 'backreference'; value: infer StringOrName extends string; } ? ['backreference', undefined] extends [Type, NameCaptureValue] ? MatchedResult<[''], InputString> : 'i' extends Flags ? StepMatch}`, StartOf, 'step', true> : InputString extends `${[Type, StringOrName] extends ['string', ''] ? '' : PrefixType}${Type extends 'string' ? StringOrName : NameCaptureValue}${infer Rest}` ? MatchedResult<[ Type extends 'string' ? StringOrName : NameCaptureValue ], Rest> : NullResult<''> : CurrentMatcher extends { type: infer Type extends keyof CharSetMap; value?: infer CharSet extends string; } ? StepMatch[Type], StartOf, Type, 'i' extends Flags ? true : false> : CurrentMatcher extends { type: infer Type extends 'optional' | 'zeroOrMore'; value: infer OptionalOrMoreMatchers extends Matcher[]; greedy: infer Greedy extends boolean; repeat?: infer Repeat extends [from: any[], to: string]; } ? [ Type, OptionalOrMoreMatchers ] extends [ 'zeroOrMore', [ { type: infer OrMoreMatcherType extends keyof InvertCharSetMap; value?: infer MaybeCharSet extends string; } ] ] ? [...RestMatchers, ...OutMostRestMatchers] extends [] | [{ type: 'endMark'; }] ? Greedy extends false ? MatchedResult<[''], InputString, never> : [ OrMoreMatcherType extends 'any' ? false : true, Match ] extends [ true, MatchedResult<[ infer InvertOpMatch extends string, ...any[] ], infer RestInputString, never> ] ? InputString extends `${infer Match}${InvertOpMatch}${RestInputString}` ? MatchedResult<[Match], `${InvertOpMatch}${RestInputString}`, never> : never : MatchedResult<[InputString], '', never> : FlattenLookahead> extends infer ResolvedRestMatchers extends Matcher[] ? MatchLast extends MatchedResult<[ infer NextMatch extends string, ...any[] ], infer RestInputString, any> ? InputString extends `${infer PossibleMatch}${NextMatch}${RestInputString}` ? OrMoreMatcherType extends 'any' ? MatchedResult<[PossibleMatch], `${NextMatch}${RestInputString}`, never> : Match extends MatchedResult<[ infer InvertOpMatch extends string, ...any[] ], infer RestPossibleMatch, never> ? PossibleMatch extends `${infer Match}${InvertOpMatch}${RestPossibleMatch}` ? MatchedResult<[ Match ], `${InvertOpMatch}${RestPossibleMatch}${NextMatch}${RestInputString}`, never> : never : MatchedResult<[PossibleMatch], `${NextMatch}${RestInputString}`, never> : never : NullResult<''> : NullResult<''> : MatchOptionalOrMoreMatcher : CurrentMatcher extends { type: 'oneOrMore'; value: infer OneOrMoreMatchers extends Matcher[]; greedy: infer Greedy extends boolean; } ? EnumerateMatchers, Flags, SkippedString, [ ...RestMatchers, ...OutMostRestMatchers ], [ '' ], NamedCaptures, StartOf> : CurrentMatcher extends { type: 'capture' | 'namedCapture' | 'captureLast'; value: infer GroupMatchers extends Matcher[]; } ? EnumerateMatchers : CurrentMatcher extends { type: 'or'; value: infer OrMatchersArray extends Matcher[][]; } ? MatchOrMatchers : CurrentMatcher extends { type: 'repeat'; value: infer RepeatMatchers extends Matcher[]; from: infer From extends `${number}`; to: infer To extends `${number}` | '' | string; greedy: infer Greedy extends boolean; } ? EnumerateMatchers, Flags, SkippedString, [ ...RestMatchers, ...OutMostRestMatchers ], [ '' ], NamedCaptures, StartOf> : CurrentMatcher extends { type: 'lookahead'; value: infer LookaheadMatchers extends Matcher[]; positive: infer Positive extends boolean; } ? EnumerateMatchers extends MatchedResult<[any, ...infer Captures extends any[]], any, infer NestNamedCaptures> ? Positive extends true ? MatchedResult<['', ...Captures], InputString, NestNamedCaptures> : NullResult<''> : Positive extends true ? NullResult<''> : MatchedResult<[ '', ...CountNumOfCaptureGroupsAs ], InputString, ResolveNamedCaptureUnion<[LookaheadMatchers], never>> : CurrentMatcher extends { type: 'lookbehind'; value: infer LookbehindMatchers extends Matcher[]; positive: infer Positive extends boolean; } ? MatchLast<`${PrevMatchedString}${SkippedString}`, LookbehindMatchers, Flags, NamedCaptures, SkippedString> extends MatchedResult<[ any, ...infer Captures extends any[] ], infer RestInputString, infer NestNamedCaptures> ? RestInputString extends '' ? Positive extends true ? MatchedResult<['', ...Captures], InputString, NestNamedCaptures> : NullResult<''> : Positive extends true ? NullResult<''> : MatchedResult<[ '', ...CountNumOfCaptureGroupsAs ], InputString, ResolveNamedCaptureUnion<[LookbehindMatchers], never>> : Positive extends true ? NullResult<''> : MatchedResult<[ '', ...CountNumOfCaptureGroupsAs ], InputString, ResolveNamedCaptureUnion<[LookbehindMatchers], never>> : CurrentMatcher extends { type: 'not'; value: infer NotMatchers extends Matcher[]; } ? ExhaustiveMatch extends NullResult ? MatchedResult<[''], Count['length'] extends Matchers['length'] ? '' : InputString, never> : NullResult<''> : CurrentMatcher extends { type: 'endMark'; } ? MatchedResult<[''], InputString, never> : never; type MatchOrMatchers | NullResult ] = [undefined, NullResult<''>], CurrentOrMatchers extends Matcher[] = OrMatchersArray[Count['length']]> = Count['length'] extends OrMatchersArray['length'] ? BestMatchedWithPrefix[1] : (StartOf extends true ? EnumerateMatchers : ExhaustiveMatch) extends MatchedResult<[ infer OrMatch extends string, ...infer OrCaptures extends any[] ], infer RestInputString, infer NestNamedCaptures> ? MatchOrMatchers, StartOf, [ ...Count, '' ], [ OrMatch, [...Count, '']['length'] extends OrMatchersArray['length'] ? true : false ] extends [ '', false ] ? [ '', MatchedResult<[ OrMatch, ...ResolveOrCaptureTuple> ], RestInputString, ResolveNamedCaptureUnion> ] : InputString extends `${infer Prefix}${OrMatch}${string}` ? BestMatchedWithPrefix[0] extends Prefix ? BestMatchedWithPrefix : BestMatchedWithPrefix[0] extends undefined | `${string}${Prefix}${string}` ? [ Prefix, MatchedResult<[ OrMatch, ...ResolveOrCaptureTuple> ], RestInputString, ResolveNamedCaptureUnion> ] : BestMatchedWithPrefix : never> : MatchOrMatchers, StartOf, [ ...Count, '' ], BestMatchedWithPrefix>; type BacktrackMatch = Count['length'] extends MatchedResultsTuple['length'] ? NullResult<''> : MatchedResultsTuple[0]['matched'] extends `${MatchedResultsTuple[Count['length']]['matched']}${infer LastMatchSeg}` ? EnumerateMatchers extends MatchedResult<[infer Matched extends string, ...any[]], any, any> ? LastMatchSeg extends `${infer Prefix}${Matched}${string}` ? Prefix extends '' ? MatchedResult<[ MatchedResultsTuple[Count['length']]['matched'], ...MatchedResultsTuple[Count['length']]['captures'] ], LastMatchSeg, ResolveNamedCaptureUnion<[ CurrentNestedMatchers ], MatchedResultsTuple[Count['length']]['namedCaputres']>> : EnumerateMatchers extends MatchedResult<[ any, ...infer LastCaptures extends any[] ], any, infer LastNamedCaptures> ? MatchedResult<[ `${MatchedResultsTuple[Count['length']]['matched']}${Prefix}`, ...LastCaptures ], LastMatchSeg extends `${Prefix}${infer Rest}` ? Rest : never, ResolveNamedCaptureUnion<[CurrentNestedMatchers], LastNamedCaptures>> : never : never : BacktrackMatch : never; type MatchOptionalOrMoreMatcher; namedCaputres: ResolveNamedCaptureUnion<[CurrentNestedMatchers], never>; } ], MatchNextMater extends boolean = Greedy extends true ? false : true, MatchedCount extends any[] = [ ...(MatchedResultsTuple extends [any, ...infer OneLess] ? OneLess : []), ...Repeat[0] ], MaxRepeatReached extends boolean = `${MatchedCount['length']}` extends Repeat[1] ? true : false> = true extends Greedy | TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentMatcherIndex, '' ], { type: 'endMark'; }> ? [ MaxRepeatReached, EnumerateMatchers ] extends [ false, MatchedResult<[ infer CurrentMatched extends string, ...infer CurrentMatchedRestArray extends any[] ], infer CurrentRestInputString, infer CurrentNamedCaptures> ] ? MatchOptionalOrMoreMatcher : TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentMatcherIndex, '' ], Matcher> extends true ? EnumerateMatchers, Flags, SkippedString, [ ], // ! should we combined and pass down rest of matchers and OutMostRestMatchers ?? [ '' ], NamedCaptures, true> extends NullResult ? BacktrackMatch<[ { matched: `${MatchedResultsTuple[0]['matched']}${InputString}`; captures: []; namedCaputres: never; }, ...MatchedResultsTuple ], Flags, SkippedString, CurrentNestedMatchers, [ ...Matchers, ...OutMostRestMatchers ], NamedCaptures, CurrentMatcherIndex> : MatchedResult<[ MatchedResultsTuple[0]['matched'], ...MatchedResultsTuple[0]['captures'] ], InputString, ResolveNamedCaptureUnion<[CurrentNestedMatchers], MatchedResultsTuple[0]['namedCaputres']>> : MatchedResult<[ MatchedResultsTuple[0]['matched'], ...MatchedResultsTuple[0]['captures'] ], InputString, ResolveNamedCaptureUnion<[CurrentNestedMatchers], MatchedResultsTuple[0]['namedCaputres']>> : TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentMatcherIndex, '' ], Matcher> extends true ? true extends MatchNextMater ? EnumerateMatchers, Flags, SkippedString, [ ], // ! should we combined and pass down rest of matchers and OutMostRestMatchers ?? [ '' ], NamedCaptures, // ? pass in zeroOrMore/optional match named capture? true> extends MatchedResult ? MatchedResult<[ MatchedResultsTuple[0]['matched'], ...MatchedResultsTuple[0]['captures'] ], InputString, ResolveNamedCaptureUnion<[CurrentNestedMatchers], MatchedResultsTuple[0]['namedCaputres']>> : MaxRepeatReached extends true ? NullResult<''> : MatchOptionalOrMoreMatcher : EnumerateMatchers extends MatchedResult<[ infer CurrentMatched extends string, ...infer CurrentMatchedRestArray extends any[] ], infer CurrentRestInputString, infer CurrentNamedCaptures> ? MatchOptionalOrMoreMatcher : NullResult<''> : MatchedResult<[ '', ...CountNumOfCaptureGroupsAs ], InputString, ResolveNamedCaptureUnion<[CurrentNestedMatchers], never>>; type PermutationResult = { results: MatchArray; namedCapture: NamedCaptures; }; type PrependAndUnionToAll = ResultArr['length'] extends Length ? ResultArr : Arr extends [ infer First extends string | undefined, ...infer Rest extends (string | undefined)[] ] ? PrependAndUnionToAll : []; type RepeatStringFromTo = `${From['length']}` extends To ? RepeatResult : RepeatStringFromTo; interface LiteralCharSetMap> { whitespace: ' '; nonWhitespace: '[non-whitespace]'; any: '[any char]'; char: '[any word char]'; nonChar: '[any non-char]'; digit: `${number}` | '[any digit]'; nonDigit: '[non-digit]'; charSet: StringToUnion; notCharSet: `[any char NOT in [${CharSet}]]`; boundary: '[boundary]'; nonBoundary: '[non-boundary]'; } type ConcateRestMatchers = [ ...(SliceMatchers extends infer RM extends Matcher[] ? RM : never), ...OutMostRestMatchers ]; type ResolvePermutation = CurrentMatcher extends { type: infer Type extends 'string' | 'backreference'; value: infer StringValue extends string; } ? ResolvePermutation : StringValue>, NamedCaptures, [ ...CurrentIndex, '' ]> : CurrentMatcher extends { type: infer Type extends keyof LiteralCharSetMap; value?: infer CharSet extends string; } ? ResolvePermutation[Type]>, NamedCaptures, [ ...CurrentIndex, '' ]> : CurrentMatcher extends { type: infer Type extends 'startOf' | 'endOf'; value: infer StartEndMatchers extends Matcher[]; } ? ResolvePermutation extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? ResolvePermutation | (Extract<`${Type extends 'startOf' ? 'Start' : 'End'} with [${ResultString}]`, `Start with [End with${string}`> extends never ? `${Type extends 'startOf' ? 'Start' : 'End'} with [${ResultString}]` : Extract<`${Type extends 'startOf' ? 'Start' : 'End'} with [${ResultString}]`, `Start with [End with${string}`>)>, ...Captures ], NamedCaptures | NextedNamedCapture, [ ...CurrentIndex, '' ]> : never : CurrentMatcher extends { type: infer Type extends 'lookahead' | 'lookbehind'; positive: infer Positive extends boolean; value: infer LookaroundMatchers extends Matcher[]; } ? ResolvePermutation, [ '' ], NamedCaptures> extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? ResolvePermutation, ...(Positive extends true ? Captures : CountNumOfCaptureGroupsAs) ], NamedCaptures | (Positive extends true ? NextedNamedCapture : ResolveNamedCaptureUnion<[LookaroundMatchers], NamedCaptures>), [ ...CurrentIndex, '' ]> : never : CurrentMatcher extends { type: infer Type extends 'capture' | 'namedCapture'; value: infer GroupMatchers extends Matcher[]; name?: infer GroupName extends string; } ? ResolvePermutation, [ '' ], NamedCaptures> extends infer Result ? Result extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? ResultString extends ResultString ? ResolvePermutation, ...[ResultString], ...Captures ], NamedCaptures | NextedNamedCapture | (Type extends 'namedCapture' ? [GroupName, ResultString] : never), [ ...CurrentIndex, '' ]> : never : never : never : CurrentMatcher extends { type: 'captureLast'; value: infer GroupMatchers extends Matcher[]; } ? ResolvePermutation extends infer Result ? Result extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? Captures extends Captures ? ResolvePermutation : [`${MatchResultArray[0]}${ResultString}`]), ...(MatchResultArray['length'] extends 1 ? Captures : Captures[number] extends undefined ? [] : Captures) ], NamedCaptures | Exclude[0], undefined]>, [ ...CurrentIndex, '' ]> : never : never : never : CurrentMatcher extends { type: 'optional'; value: infer OptionalMatchers extends Matcher[]; greedy: infer Greedy extends boolean; repeat?: infer Repeat extends [from: any[], to: string]; } ? ResolvePermutation, [ '' ], NamedCaptures> extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? ResolvePermutation : TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentIndex, '' ], Matcher> extends true ? [never, string] extends Repeat ? ResultString | '' : RepeatStringFromTo : ''>, ...(Greedy extends true ? Captures | CountNumOfCaptureGroupsAs : TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentIndex, '' ], Matcher> extends true ? Captures : CountNumOfCaptureGroupsAs) ], NamedCaptures | (Greedy extends true ? NextedNamedCapture | ResolveNamedCaptureUnion<[OptionalMatchers], never> : TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentIndex, '' ], Matcher> extends true ? NextedNamedCapture : ResolveNamedCaptureUnion<[OptionalMatchers], NamedCaptures>), [ ...CurrentIndex, '' ]> : never : CurrentMatcher extends { type: 'or'; value: infer OrMatchersArray extends Matcher[][]; } ? OrMatchersArray[number] extends infer OrMatchers extends Matcher[] ? OrMatchers extends OrMatchers ? ResolvePermutation, [ '' ], NamedCaptures> extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? ResolvePermutation, ...ResolveOrCaptureTuple> ], NamedCaptures | ResolveNamedCaptureUnion, [ ...CurrentIndex, '' ]> : never : never : never : CurrentMatcher extends { type: infer Type extends 'zeroOrMore' | 'oneOrMore'; value: infer AnyOrMoreMatchers extends Matcher[]; greedy: infer Greedy extends boolean; } ? ResolvePermutation, [ '' ], NamedCaptures> extends infer Result ? Result extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? ResultString extends ResultString ? ResolvePermutation ? (Type extends 'zeroOrMore' ? '' : never) | ResultString | `${ResultString}${string}${ResultString}` | `[ ${Type extends 'zeroOrMore' ? 'zero' : 'one'} or more of \`${ResultString}\` ]` : Type extends 'zeroOrMore' ? '' : ResultString>, ...(true extends Greedy | TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentIndex, '' ], Matcher> ? Type extends 'zeroOrMore' ? CountNumOfCaptureGroupsAs | Captures : Captures : Type extends 'zeroOrMore' ? CountNumOfCaptureGroupsAs : Captures) ], NamedCaptures | (true extends Greedy | TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentIndex, '' ], Matcher> ? Type extends 'zeroOrMore' ? ResolveNamedCaptureUnion<[AnyOrMoreMatchers], never> | NextedNamedCapture : NextedNamedCapture : Type extends 'zeroOrMore' ? ResolveNamedCaptureUnion<[AnyOrMoreMatchers], never> : NextedNamedCapture), [ ...CurrentIndex, '' ]> : never : never : never : CurrentMatcher extends { type: 'repeat'; value: infer RepeatMatchers extends Matcher[]; from: infer From extends `${number}`; to: infer To extends `${number}` | '' | string; greedy: infer Greedy extends boolean; } ? ResolvePermutation, ConcateRestMatchers, [ '' ], NamedCaptures> extends infer Result ? Result extends PermutationResult<[ infer ResultString extends string, ...infer Captures extends any[] ], infer NextedNamedCapture> ? ResolvePermutation ? ResultString extends `${string}zero${string}\`${infer RepeatString}\`${string}` ? `[ repeat \`${RepeatString}\` ${From} to unlimited times ]` : ResultString : [From, To] extends ['0', ''] ? '' : ResultString | (string extends To ? `[ repeat \`${ResultString}\` ${From} times ]` : never)>, ...(true extends Greedy | TupleItemExtendsType<[ ...Matchers, ...OutMostRestMatchers ], [ ...CurrentIndex, '' ], Matcher> ? Captures : From extends '0' ? CountNumOfCaptureGroupsAs : Captures) ], NamedCaptures | NextedNamedCapture, [ ...CurrentIndex, '' ]> : never : never : PermutationResult; type ResolveRepalceValue = ReplaceValue extends `${infer Before}$${infer After}` ? After extends `${infer FirstChar extends '$' | '&' | '`' | "'" | '0' | Extract}${infer Rest}` ? ResolveRepalceValue : After extends `<${infer Name extends NamedCaptures[0]}>${infer Rest}` ? ResolveRepalceValue[1]; }[Name]}`> : ResolveRepalceValue : `${ResultRepalceString}${ReplaceValue}`; type GlobalReplace = ExhaustiveMatch extends infer Result ? Result extends MatchedResult ? InputString extends `${infer Precedes}${MatchArray[0]}${RestInputString}` ? GlobalReplace}`> : never : `${ResultString}${InputString}` : never; type Flag = 'd' | 'g' | 'i' | 'm' | 's' | 'u' | 'y'; type TypedRegExp = RegExp & { regexp: RegExpPattern; flags: Flags; parsedRegExpAST: ParsedRegExpAST; }; type RegExpIterableIterator = Omit, 'next'> & { _matchedTuple: MatchedTuple; next: () => IteratorResult; }; type ValidateRegExpSyntaxError = ParseRegExp> = RegExpParsedResult extends RegExpSyntaxError ? RegExpParsedResult : RawRegExpPattern; declare function createRegExp>(pattern: ValidateRegExpSyntaxError, flags?: Flags[] | Set): TypedRegExp; declare function spreadRegExpMatchArray IterableIterator; _matchArray: any[]; } | null | undefined>(matchArray: MatchArray): MatchArray extends { _matchArray: any[]; [Symbol.iterator]: () => IterableIterator; } ? MatchArray["_matchArray"] : null; declare function spreadRegExpIterator & { _matchedTuple: any; }) | null>(iterableIterator: Iter): Iter extends { _matchedTuple: infer Tuple; } ? Tuple : null; type MatchRegExp = Matcher[] extends ParsedRegExpAST ? RegExpMatchArray | null : string extends InputString ? ResolvePermutation extends PermutationResult ? 'g' extends Flags ? MatchArray[0][] : RegExpMatchResult<{ matched: 'i' extends Flags ? PrependAndUnionToAll : MatchArray; namedCaptures: NamedCaptures; input: InputString; restInput: undefined; }> | null : never : 'g' extends Flags ? GlobalMatch : ExhaustiveMatch extends infer Result ? Result extends MatchedResult ? RegExpMatchResult<{ matched: MatchArray; namedCaptures: NamedCaptures; input: InputString; restInput: RestInputString; }> : Result extends NullResult ? Result['results'] : never : never; type RegExpMatchResult : never; input: Result['input']; groups: (() => Result['namedCaptures']) extends () => never ? undefined : { [K in Result['namedCaptures'][0]]: Extract[1]; }; keys: () => IterableIterator>; _matchArray: Result['matched']; }> = { [K in Exclude | keyof MatchObject]: K extends keyof MatchObject ? MatchObject[K] : K extends keyof Result['matched'] ? Result['matched'][K] : never; } & Pick, keyof MatchObject>>; type MatchAllRegExp = Matcher[] extends ParsedRegExpAST ? RegExpMatchArray[] : ParsedRegExpAST extends ParsedRegExpAST ? string extends InputString ? ResolvePermutation extends PermutationResult ? RegExpIterableIterator<(RegExpMatchResult<{ matched: 'i' extends Flags ? PrependAndUnionToAll : MatchArray; namedCaptures: NamedCaptures; input: InputString; restInput: undefined; }> | null)[]> : never : ExhaustiveMatch extends infer Result ? Result extends MatchedResult ? MatchAllRegExp ], InitialInputString> : MatchedResultTuple extends [] ? null : RegExpIterableIterator : never : never; type ReplaceWithRegExp = 'g' extends Flags ? GlobalReplace : ExhaustiveMatch extends infer Result ? Result extends MatchedResult ? InputString extends `${infer Precedes}${MatchArray[0]}${RestInputString}` ? `${Precedes}${ResolveRepalceValue}${RestInputString}` : never : InputString : never; export { ExhaustiveMatch, Flag, GlobalMatch, MatchAllRegExp, MatchRegExp, Matcher, ParseRegExp, RegExpIterableIterator, RegExpMatchResult, ReplaceWithRegExp, ResolvePermutation, TypedRegExp, ValidateRegExpSyntaxError, createRegExp, spreadRegExpIterator, spreadRegExpMatchArray };