human-regex
Advanced tools
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"human-regex.cjs.js","sources":["../src/human-regex.ts"],"sourcesContent":["type PartialBut<T, K extends keyof T> = Partial<T> & Pick<T, K>;\n\nconst escapeCache = new Map<string, string>();\n\nconst Flags = {\n GLOBAL: \"g\",\n NON_SENSITIVE: \"i\",\n MULTILINE: \"m\",\n DOT_ALL: \"s\",\n UNICODE: \"u\",\n STICKY: \"y\",\n} as const;\n\nconst Ranges = Object.freeze({\n digit: \"0-9\",\n lowercaseLetter: \"a-z\",\n uppercaseLetter: \"A-Z\",\n letter: \"a-zA-Z\",\n alphanumeric: \"a-zA-Z0-9\",\n anyCharacter: \".\",\n});\n\ntype RangeKeys = keyof typeof Ranges;\n\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\n\ntype Quantifiers =\n | \"exactly\"\n | \"atLeast\"\n | \"atMost\"\n | \"between\"\n | \"oneOrMore\"\n | \"zeroOrMore\"\n | \"repeat\";\ntype QuantifierMethods = Quantifiers | \"optional\" | \"lazy\";\n\ntype WithLazy = HumanRegex;\ntype Base = Omit<HumanRegex, \"lazy\">;\n\ntype AtStart = Omit<Base, QuantifierMethods | \"endGroup\">;\ntype AfterAnchor = Omit<Base, QuantifierMethods | \"or\">;\ntype SimpleQuantifier = Omit<Base, Quantifiers>;\ntype LazyQuantifier = Omit<WithLazy, Quantifiers>;\n\nclass HumanRegex {\n private parts: string[];\n private flags: Set<string>;\n\n constructor() {\n this.parts = [];\n this.flags = new Set<string>();\n }\n\n digit(): Base {\n return this.add(\"\\\\d\");\n }\n\n special(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): Base {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): Base {\n return this.add(\"\\\\s\");\n }\n\n nonWhitespace(): Base {\n return this.add(\"\\\\S\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): AfterAnchor {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): Base {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n notRange(chars: string): Base {\n return this.add(`[^${chars}]`);\n }\n\n lazy(): Base {\n const lastPart = this.parts.pop();\n if (!lastPart) throw new Error(\"No quantifier to make lazy\");\n return this.add(`${lastPart}?`);\n }\n\n letter(): Base {\n return this.add(\"[a-zA-Z]\");\n }\n\n anyCharacter(): Base {\n return this.add(\".\");\n }\n\n negativeLookahead(pattern: string): Base {\n return this.add(`(?!${pattern})`);\n }\n\n positiveLookahead(pattern: string): Base {\n return this.add(`(?=${pattern})`);\n }\n\n positiveLookbehind(pattern: string): Base {\n return this.add(`(?<=${pattern})`);\n }\n\n negativeLookbehind(pattern: string): Base {\n return this.add(`(?<!${pattern})`);\n }\n\n hasSpecialCharacter(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n hasDigit(): Base {\n return this.add(\"(?=.*\\\\d)\");\n }\n\n hasLetter(): Base {\n return this.add(\"(?=.*[a-zA-Z])\");\n }\n\n optional(): SimpleQuantifier {\n return this.add(Quantifiers.optional);\n }\n\n exactly(n: number): SimpleQuantifier {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): LazyQuantifier {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): LazyQuantifier {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): LazyQuantifier {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): LazyQuantifier {\n return this.add(Quantifiers.oneOrMore);\n }\n\n zeroOrMore(): LazyQuantifier {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n startNamedGroup(name: string): AfterAnchor {\n return this.add(`(?<${name}>`);\n }\n\n startGroup(): AfterAnchor {\n return this.add(\"(?:\");\n }\n\n startCaptureGroup(): AfterAnchor {\n return this.add(\"(\");\n }\n\n wordBoundary(): Base {\n return this.add(\"\\\\b\");\n }\n\n nonWordBoundary(): Base {\n return this.add(\"\\\\B\");\n }\n\n endGroup(): Base {\n return this.add(\")\");\n }\n\n startAnchor(): AfterAnchor {\n return this.add(\"^\");\n }\n\n endAnchor(): AfterAnchor {\n return this.add(\"$\");\n }\n\n global(): this {\n this.flags.add(Flags.GLOBAL);\n return this;\n }\n\n nonSensitive(): this {\n this.flags.add(Flags.NON_SENSITIVE);\n return this;\n }\n\n multiline(): this {\n this.flags.add(Flags.MULTILINE);\n return this;\n }\n\n dotAll(): this {\n this.flags.add(Flags.DOT_ALL);\n return this;\n }\n\n sticky(): this {\n this.flags.add(Flags.STICKY);\n return this;\n }\n\n unicodeChar(variant?: \"u\" | \"l\" | \"t\" | \"m\" | \"o\"): Base {\n this.flags.add(Flags.UNICODE);\n const validVariants = new Set([\"u\", \"l\", \"t\", \"m\", \"o\"] as const);\n\n if (variant !== undefined && !validVariants.has(variant)) {\n throw new Error(`Invalid Unicode letter variant: ${variant}`);\n }\n\n return this.add(`\\\\p{L${variant ?? \"\"}}`);\n }\n\n unicodeDigit(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{N}\");\n }\n\n unicodePunctuation(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{P}\");\n }\n\n unicodeSymbol(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{S}\");\n }\n\n repeat(count: number): Base {\n if (this.parts.length === 0) {\n throw new Error(\"No pattern to repeat\");\n }\n\n const lastPart = this.parts.pop();\n this.parts.push(`(${lastPart}){${count}}`);\n return this;\n }\n\n ipv4Octet(): Base {\n return this.add(\"(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)\");\n }\n\n protocol(): Base {\n return this.add(\"https?://\");\n }\n\n www(): Base {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): Base {\n return this.add(\"(com|org|net)\");\n }\n\n path(): Base {\n return this.add(\"(/\\\\w+)*\");\n }\n\n private add(part: string): this {\n this.parts.push(part);\n return this;\n }\n\n toString(): string {\n return this.parts.join(\"\");\n }\n\n toRegExp(): RegExp {\n return new RegExp(this.toString(), [...this.flags].join(\"\"));\n }\n}\n\nfunction escapeLiteral(text: string): string {\n if (!escapeCache.has(text)) {\n escapeCache.set(text, text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n }\n return escapeCache.get(text)!;\n}\n\nconst createRegex = (): AtStart => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (builder: () => PartialBut<HumanRegex, \"toRegExp\">) => {\n const regex = builder().toRegExp();\n return () => new RegExp(regex.source, regex.flags);\n };\n\n return {\n email: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .word()\n .oneOrMore()\n .literal(\"@\")\n .word()\n .oneOrMore()\n .startGroup()\n .literal(\".\")\n .word()\n .oneOrMore()\n .endGroup()\n .zeroOrMore()\n .literal(\".\")\n .letter()\n .atLeast(2)\n .endAnchor()\n ),\n url: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .protocol()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .endAnchor()\n ),\n phoneInternational: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .literal(\"+\")\n .digit()\n .between(1, 3)\n .literal(\"-\")\n .digit()\n .between(3, 14)\n .endAnchor()\n ),\n };\n})();\n\nexport { createRegex, Patterns, Flags, Ranges, Quantifiers };\n"],"names":["escapeCache","Map","Flags","GLOBAL","NON_SENSITIVE","MULTILINE","DOT_ALL","UNICODE","STICKY","Ranges","Object","freeze","digit","lowercaseLetter","uppercaseLetter","letter","alphanumeric","anyCharacter","Quantifiers","zeroOrMore","oneOrMore","optional","HumanRegex","constructor","this","parts","flags","Set","add","special","word","whitespace","nonWhitespace","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","notRange","chars","lazy","lastPart","pop","negativeLookahead","pattern","positiveLookahead","positiveLookbehind","negativeLookbehind","hasSpecialCharacter","hasDigit","hasLetter","exactly","n","atLeast","atMost","between","min","max","startNamedGroup","startGroup","startCaptureGroup","wordBoundary","nonWordBoundary","endGroup","startAnchor","endAnchor","global","nonSensitive","multiline","dotAll","sticky","unicodeChar","variant","validVariants","undefined","unicodeDigit","unicodePunctuation","unicodeSymbol","repeat","count","length","push","ipv4Octet","protocol","www","tld","path","part","toString","join","toRegExp","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","source","email","url","phoneInternational"],"mappings":"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"} | ||
| {"version":3,"file":"human-regex.cjs.js","sources":["../src/human-regex.ts"],"sourcesContent":["type PartialBut<T, K extends keyof T> = Partial<T> & Pick<T, K>;\n\nconst escapeCache = new Map<string, string>();\n\nconst Flags = {\n GLOBAL: \"g\",\n NON_SENSITIVE: \"i\",\n MULTILINE: \"m\",\n DOT_ALL: \"s\",\n UNICODE: \"u\",\n STICKY: \"y\",\n} as const;\n\nconst Ranges = Object.freeze({\n digit: \"0-9\",\n lowercaseLetter: \"a-z\",\n uppercaseLetter: \"A-Z\",\n letter: \"a-zA-Z\",\n alphanumeric: \"a-zA-Z0-9\",\n anyCharacter: \".\",\n});\n\ntype RangeKeys = keyof typeof Ranges;\n\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\n\ntype Quantifiers =\n | \"exactly\"\n | \"atLeast\"\n | \"atMost\"\n | \"between\"\n | \"oneOrMore\"\n | \"zeroOrMore\"\n | \"repeat\";\ntype QuantifierMethods = Quantifiers | \"optional\" | \"lazy\";\n\ntype WithLazy = HumanRegex;\ntype Base = Omit<HumanRegex, \"lazy\">;\ntype AtStart = Omit<Base, QuantifierMethods | \"endGroup\">;\ntype AfterAnchor = Omit<Base, QuantifierMethods | \"or\">;\ntype SimpleQuantifier = Omit<Base, Quantifiers>;\ntype LazyQuantifier = Omit<WithLazy, Quantifiers>;\n\nclass HumanRegex {\n private parts: string[];\n private flags: Set<string>;\n\n constructor() {\n this.parts = [];\n this.flags = new Set<string>();\n }\n\n digit(): Base {\n return this.add(\"\\\\d\");\n }\n\n special(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): Base {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): Base {\n return this.add(\"\\\\s\");\n }\n\n nonWhitespace(): Base {\n return this.add(\"\\\\S\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): AfterAnchor {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): Base {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n notRange(chars: string): Base {\n return this.add(`[^${chars}]`);\n }\n\n lazy(): Base {\n const lastPart = this.parts.pop();\n if (!lastPart) throw new Error(\"No quantifier to make lazy\");\n return this.add(`${lastPart}?`);\n }\n\n letter(): Base {\n return this.add(\"[a-zA-Z]\");\n }\n\n anyCharacter(): Base {\n return this.add(\".\");\n }\n\n negativeLookahead(pattern: string): Base {\n return this.add(`(?!${pattern})`);\n }\n\n positiveLookahead(pattern: string): Base {\n return this.add(`(?=${pattern})`);\n }\n\n positiveLookbehind(pattern: string): Base {\n return this.add(`(?<=${pattern})`);\n }\n\n negativeLookbehind(pattern: string): Base {\n return this.add(`(?<!${pattern})`);\n }\n\n hasSpecialCharacter(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n hasDigit(): Base {\n return this.add(\"(?=.*\\\\d)\");\n }\n\n hasLetter(): Base {\n return this.add(\"(?=.*[a-zA-Z])\");\n }\n\n optional(): SimpleQuantifier {\n return this.add(Quantifiers.optional);\n }\n\n exactly(n: number): SimpleQuantifier {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): LazyQuantifier {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): LazyQuantifier {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): LazyQuantifier {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): LazyQuantifier {\n return this.add(Quantifiers.oneOrMore);\n }\n\n zeroOrMore(): LazyQuantifier {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n startNamedGroup(name: string): AfterAnchor {\n return this.add(`(?<${name}>`);\n }\n\n startGroup(): AfterAnchor {\n return this.add(\"(?:\");\n }\n\n startCaptureGroup(): AfterAnchor {\n return this.add(\"(\");\n }\n\n wordBoundary(): Base {\n return this.add(\"\\\\b\");\n }\n\n nonWordBoundary(): Base {\n return this.add(\"\\\\B\");\n }\n\n endGroup(): Base {\n return this.add(\")\");\n }\n\n startAnchor(): AfterAnchor {\n return this.add(\"^\");\n }\n\n endAnchor(): AfterAnchor {\n return this.add(\"$\");\n }\n\n global(): this {\n this.flags.add(Flags.GLOBAL);\n return this;\n }\n\n nonSensitive(): this {\n this.flags.add(Flags.NON_SENSITIVE);\n return this;\n }\n\n multiline(): this {\n this.flags.add(Flags.MULTILINE);\n return this;\n }\n\n dotAll(): this {\n this.flags.add(Flags.DOT_ALL);\n return this;\n }\n\n sticky(): this {\n this.flags.add(Flags.STICKY);\n return this;\n }\n\n unicodeChar(variant?: \"u\" | \"l\" | \"t\" | \"m\" | \"o\"): Base {\n this.flags.add(Flags.UNICODE);\n const validVariants = new Set([\"u\", \"l\", \"t\", \"m\", \"o\"] as const);\n\n if (variant !== undefined && !validVariants.has(variant)) {\n throw new Error(`Invalid Unicode letter variant: ${variant}`);\n }\n\n return this.add(`\\\\p{L${variant ?? \"\"}}`);\n }\n\n unicodeDigit(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{N}\");\n }\n\n unicodePunctuation(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{P}\");\n }\n\n unicodeSymbol(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{S}\");\n }\n\n repeat(count: number): Base {\n if (this.parts.length === 0) {\n throw new Error(\"No pattern to repeat\");\n }\n\n const lastPart = this.parts.pop();\n this.parts.push(`(${lastPart}){${count}}`);\n return this;\n }\n\n ipv4Octet(): Base {\n return this.add(\"(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)\");\n }\n\n protocol(): Base {\n return this.add(\"https?://\");\n }\n\n www(): Base {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): Base {\n return this.add(\"(com|org|net)\");\n }\n\n path(): Base {\n return this.add(\"(/\\\\w+)*\");\n }\n\n private add(part: string): this {\n this.parts.push(part);\n return this;\n }\n\n toString(): string {\n return this.parts.join(\"\");\n }\n\n toRegExp(): RegExp {\n return new RegExp(this.toString(), [...this.flags].join(\"\"));\n }\n}\n\nfunction escapeLiteral(text: string): string {\n if (!escapeCache.has(text)) {\n escapeCache.set(text, text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n }\n return escapeCache.get(text)!;\n}\n\nconst createRegex = (): AtStart => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (\n builder: () => PartialBut<HumanRegex, \"toRegExp\">\n ) => {\n const regex = builder().toRegExp();\n return () => new RegExp(regex.source, regex.flags);\n };\n\n return {\n email: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .word()\n .oneOrMore()\n .literal(\"@\")\n .word()\n .oneOrMore()\n .startGroup()\n .literal(\".\")\n .word()\n .oneOrMore()\n .endGroup()\n .zeroOrMore()\n .literal(\".\")\n .letter()\n .atLeast(2)\n .endAnchor()\n ),\n url: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .protocol()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .endAnchor()\n ),\n phoneInternational: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .literal(\"+\")\n .digit()\n .between(1, 3)\n .literal(\"-\")\n .digit()\n .between(3, 14)\n .endAnchor()\n ),\n };\n})();\n\nexport { createRegex, Patterns, Flags, Ranges, Quantifiers };\n"],"names":["escapeCache","Map","Flags","GLOBAL","NON_SENSITIVE","MULTILINE","DOT_ALL","UNICODE","STICKY","Ranges","Object","freeze","digit","lowercaseLetter","uppercaseLetter","letter","alphanumeric","anyCharacter","Quantifiers","zeroOrMore","oneOrMore","optional","HumanRegex","constructor","this","parts","flags","Set","add","special","word","whitespace","nonWhitespace","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","notRange","chars","lazy","lastPart","pop","negativeLookahead","pattern","positiveLookahead","positiveLookbehind","negativeLookbehind","hasSpecialCharacter","hasDigit","hasLetter","exactly","n","atLeast","atMost","between","min","max","startNamedGroup","startGroup","startCaptureGroup","wordBoundary","nonWordBoundary","endGroup","startAnchor","endAnchor","global","nonSensitive","multiline","dotAll","sticky","unicodeChar","variant","validVariants","undefined","unicodeDigit","unicodePunctuation","unicodeSymbol","repeat","count","length","push","ipv4Octet","protocol","www","tld","path","part","toString","join","toRegExp","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","source","email","url","phoneInternational"],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"human-regex.esm.js","sources":["../src/human-regex.ts"],"sourcesContent":["type PartialBut<T, K extends keyof T> = Partial<T> & Pick<T, K>;\n\nconst escapeCache = new Map<string, string>();\n\nconst Flags = {\n GLOBAL: \"g\",\n NON_SENSITIVE: \"i\",\n MULTILINE: \"m\",\n DOT_ALL: \"s\",\n UNICODE: \"u\",\n STICKY: \"y\",\n} as const;\n\nconst Ranges = Object.freeze({\n digit: \"0-9\",\n lowercaseLetter: \"a-z\",\n uppercaseLetter: \"A-Z\",\n letter: \"a-zA-Z\",\n alphanumeric: \"a-zA-Z0-9\",\n anyCharacter: \".\",\n});\n\ntype RangeKeys = keyof typeof Ranges;\n\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\n\ntype Quantifiers =\n | \"exactly\"\n | \"atLeast\"\n | \"atMost\"\n | \"between\"\n | \"oneOrMore\"\n | \"zeroOrMore\"\n | \"repeat\";\ntype QuantifierMethods = Quantifiers | \"optional\" | \"lazy\";\n\ntype WithLazy = HumanRegex;\ntype Base = Omit<HumanRegex, \"lazy\">;\n\ntype AtStart = Omit<Base, QuantifierMethods | \"endGroup\">;\ntype AfterAnchor = Omit<Base, QuantifierMethods | \"or\">;\ntype SimpleQuantifier = Omit<Base, Quantifiers>;\ntype LazyQuantifier = Omit<WithLazy, Quantifiers>;\n\nclass HumanRegex {\n private parts: string[];\n private flags: Set<string>;\n\n constructor() {\n this.parts = [];\n this.flags = new Set<string>();\n }\n\n digit(): Base {\n return this.add(\"\\\\d\");\n }\n\n special(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): Base {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): Base {\n return this.add(\"\\\\s\");\n }\n\n nonWhitespace(): Base {\n return this.add(\"\\\\S\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): AfterAnchor {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): Base {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n notRange(chars: string): Base {\n return this.add(`[^${chars}]`);\n }\n\n lazy(): Base {\n const lastPart = this.parts.pop();\n if (!lastPart) throw new Error(\"No quantifier to make lazy\");\n return this.add(`${lastPart}?`);\n }\n\n letter(): Base {\n return this.add(\"[a-zA-Z]\");\n }\n\n anyCharacter(): Base {\n return this.add(\".\");\n }\n\n negativeLookahead(pattern: string): Base {\n return this.add(`(?!${pattern})`);\n }\n\n positiveLookahead(pattern: string): Base {\n return this.add(`(?=${pattern})`);\n }\n\n positiveLookbehind(pattern: string): Base {\n return this.add(`(?<=${pattern})`);\n }\n\n negativeLookbehind(pattern: string): Base {\n return this.add(`(?<!${pattern})`);\n }\n\n hasSpecialCharacter(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n hasDigit(): Base {\n return this.add(\"(?=.*\\\\d)\");\n }\n\n hasLetter(): Base {\n return this.add(\"(?=.*[a-zA-Z])\");\n }\n\n optional(): SimpleQuantifier {\n return this.add(Quantifiers.optional);\n }\n\n exactly(n: number): SimpleQuantifier {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): LazyQuantifier {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): LazyQuantifier {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): LazyQuantifier {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): LazyQuantifier {\n return this.add(Quantifiers.oneOrMore);\n }\n\n zeroOrMore(): LazyQuantifier {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n startNamedGroup(name: string): AfterAnchor {\n return this.add(`(?<${name}>`);\n }\n\n startGroup(): AfterAnchor {\n return this.add(\"(?:\");\n }\n\n startCaptureGroup(): AfterAnchor {\n return this.add(\"(\");\n }\n\n wordBoundary(): Base {\n return this.add(\"\\\\b\");\n }\n\n nonWordBoundary(): Base {\n return this.add(\"\\\\B\");\n }\n\n endGroup(): Base {\n return this.add(\")\");\n }\n\n startAnchor(): AfterAnchor {\n return this.add(\"^\");\n }\n\n endAnchor(): AfterAnchor {\n return this.add(\"$\");\n }\n\n global(): this {\n this.flags.add(Flags.GLOBAL);\n return this;\n }\n\n nonSensitive(): this {\n this.flags.add(Flags.NON_SENSITIVE);\n return this;\n }\n\n multiline(): this {\n this.flags.add(Flags.MULTILINE);\n return this;\n }\n\n dotAll(): this {\n this.flags.add(Flags.DOT_ALL);\n return this;\n }\n\n sticky(): this {\n this.flags.add(Flags.STICKY);\n return this;\n }\n\n unicodeChar(variant?: \"u\" | \"l\" | \"t\" | \"m\" | \"o\"): Base {\n this.flags.add(Flags.UNICODE);\n const validVariants = new Set([\"u\", \"l\", \"t\", \"m\", \"o\"] as const);\n\n if (variant !== undefined && !validVariants.has(variant)) {\n throw new Error(`Invalid Unicode letter variant: ${variant}`);\n }\n\n return this.add(`\\\\p{L${variant ?? \"\"}}`);\n }\n\n unicodeDigit(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{N}\");\n }\n\n unicodePunctuation(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{P}\");\n }\n\n unicodeSymbol(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{S}\");\n }\n\n repeat(count: number): Base {\n if (this.parts.length === 0) {\n throw new Error(\"No pattern to repeat\");\n }\n\n const lastPart = this.parts.pop();\n this.parts.push(`(${lastPart}){${count}}`);\n return this;\n }\n\n ipv4Octet(): Base {\n return this.add(\"(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)\");\n }\n\n protocol(): Base {\n return this.add(\"https?://\");\n }\n\n www(): Base {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): Base {\n return this.add(\"(com|org|net)\");\n }\n\n path(): Base {\n return this.add(\"(/\\\\w+)*\");\n }\n\n private add(part: string): this {\n this.parts.push(part);\n return this;\n }\n\n toString(): string {\n return this.parts.join(\"\");\n }\n\n toRegExp(): RegExp {\n return new RegExp(this.toString(), [...this.flags].join(\"\"));\n }\n}\n\nfunction escapeLiteral(text: string): string {\n if (!escapeCache.has(text)) {\n escapeCache.set(text, text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n }\n return escapeCache.get(text)!;\n}\n\nconst createRegex = (): AtStart => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (builder: () => PartialBut<HumanRegex, \"toRegExp\">) => {\n const regex = builder().toRegExp();\n return () => new RegExp(regex.source, regex.flags);\n };\n\n return {\n email: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .word()\n .oneOrMore()\n .literal(\"@\")\n .word()\n .oneOrMore()\n .startGroup()\n .literal(\".\")\n .word()\n .oneOrMore()\n .endGroup()\n .zeroOrMore()\n .literal(\".\")\n .letter()\n .atLeast(2)\n .endAnchor()\n ),\n url: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .protocol()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .endAnchor()\n ),\n phoneInternational: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .literal(\"+\")\n .digit()\n .between(1, 3)\n .literal(\"-\")\n .digit()\n .between(3, 14)\n .endAnchor()\n ),\n };\n})();\n\nexport { createRegex, Patterns, Flags, Ranges, Quantifiers };\n"],"names":["escapeCache","Map","Flags","GLOBAL","NON_SENSITIVE","MULTILINE","DOT_ALL","UNICODE","STICKY","Ranges","Object","freeze","digit","lowercaseLetter","uppercaseLetter","letter","alphanumeric","anyCharacter","Quantifiers","zeroOrMore","oneOrMore","optional","HumanRegex","constructor","this","parts","flags","Set","add","special","word","whitespace","nonWhitespace","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","notRange","chars","lazy","lastPart","pop","negativeLookahead","pattern","positiveLookahead","positiveLookbehind","negativeLookbehind","hasSpecialCharacter","hasDigit","hasLetter","exactly","n","atLeast","atMost","between","min","max","startNamedGroup","startGroup","startCaptureGroup","wordBoundary","nonWordBoundary","endGroup","startAnchor","endAnchor","global","nonSensitive","multiline","dotAll","sticky","unicodeChar","variant","validVariants","undefined","unicodeDigit","unicodePunctuation","unicodeSymbol","repeat","count","length","push","ipv4Octet","protocol","www","tld","path","part","toString","join","toRegExp","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","source","email","url","phoneInternational"],"mappings":"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"} | ||
| {"version":3,"file":"human-regex.esm.js","sources":["../src/human-regex.ts"],"sourcesContent":["type PartialBut<T, K extends keyof T> = Partial<T> & Pick<T, K>;\n\nconst escapeCache = new Map<string, string>();\n\nconst Flags = {\n GLOBAL: \"g\",\n NON_SENSITIVE: \"i\",\n MULTILINE: \"m\",\n DOT_ALL: \"s\",\n UNICODE: \"u\",\n STICKY: \"y\",\n} as const;\n\nconst Ranges = Object.freeze({\n digit: \"0-9\",\n lowercaseLetter: \"a-z\",\n uppercaseLetter: \"A-Z\",\n letter: \"a-zA-Z\",\n alphanumeric: \"a-zA-Z0-9\",\n anyCharacter: \".\",\n});\n\ntype RangeKeys = keyof typeof Ranges;\n\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\n\ntype Quantifiers =\n | \"exactly\"\n | \"atLeast\"\n | \"atMost\"\n | \"between\"\n | \"oneOrMore\"\n | \"zeroOrMore\"\n | \"repeat\";\ntype QuantifierMethods = Quantifiers | \"optional\" | \"lazy\";\n\ntype WithLazy = HumanRegex;\ntype Base = Omit<HumanRegex, \"lazy\">;\ntype AtStart = Omit<Base, QuantifierMethods | \"endGroup\">;\ntype AfterAnchor = Omit<Base, QuantifierMethods | \"or\">;\ntype SimpleQuantifier = Omit<Base, Quantifiers>;\ntype LazyQuantifier = Omit<WithLazy, Quantifiers>;\n\nclass HumanRegex {\n private parts: string[];\n private flags: Set<string>;\n\n constructor() {\n this.parts = [];\n this.flags = new Set<string>();\n }\n\n digit(): Base {\n return this.add(\"\\\\d\");\n }\n\n special(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): Base {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): Base {\n return this.add(\"\\\\s\");\n }\n\n nonWhitespace(): Base {\n return this.add(\"\\\\S\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): AfterAnchor {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): Base {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n notRange(chars: string): Base {\n return this.add(`[^${chars}]`);\n }\n\n lazy(): Base {\n const lastPart = this.parts.pop();\n if (!lastPart) throw new Error(\"No quantifier to make lazy\");\n return this.add(`${lastPart}?`);\n }\n\n letter(): Base {\n return this.add(\"[a-zA-Z]\");\n }\n\n anyCharacter(): Base {\n return this.add(\".\");\n }\n\n negativeLookahead(pattern: string): Base {\n return this.add(`(?!${pattern})`);\n }\n\n positiveLookahead(pattern: string): Base {\n return this.add(`(?=${pattern})`);\n }\n\n positiveLookbehind(pattern: string): Base {\n return this.add(`(?<=${pattern})`);\n }\n\n negativeLookbehind(pattern: string): Base {\n return this.add(`(?<!${pattern})`);\n }\n\n hasSpecialCharacter(): Base {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n hasDigit(): Base {\n return this.add(\"(?=.*\\\\d)\");\n }\n\n hasLetter(): Base {\n return this.add(\"(?=.*[a-zA-Z])\");\n }\n\n optional(): SimpleQuantifier {\n return this.add(Quantifiers.optional);\n }\n\n exactly(n: number): SimpleQuantifier {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): LazyQuantifier {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): LazyQuantifier {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): LazyQuantifier {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): LazyQuantifier {\n return this.add(Quantifiers.oneOrMore);\n }\n\n zeroOrMore(): LazyQuantifier {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n startNamedGroup(name: string): AfterAnchor {\n return this.add(`(?<${name}>`);\n }\n\n startGroup(): AfterAnchor {\n return this.add(\"(?:\");\n }\n\n startCaptureGroup(): AfterAnchor {\n return this.add(\"(\");\n }\n\n wordBoundary(): Base {\n return this.add(\"\\\\b\");\n }\n\n nonWordBoundary(): Base {\n return this.add(\"\\\\B\");\n }\n\n endGroup(): Base {\n return this.add(\")\");\n }\n\n startAnchor(): AfterAnchor {\n return this.add(\"^\");\n }\n\n endAnchor(): AfterAnchor {\n return this.add(\"$\");\n }\n\n global(): this {\n this.flags.add(Flags.GLOBAL);\n return this;\n }\n\n nonSensitive(): this {\n this.flags.add(Flags.NON_SENSITIVE);\n return this;\n }\n\n multiline(): this {\n this.flags.add(Flags.MULTILINE);\n return this;\n }\n\n dotAll(): this {\n this.flags.add(Flags.DOT_ALL);\n return this;\n }\n\n sticky(): this {\n this.flags.add(Flags.STICKY);\n return this;\n }\n\n unicodeChar(variant?: \"u\" | \"l\" | \"t\" | \"m\" | \"o\"): Base {\n this.flags.add(Flags.UNICODE);\n const validVariants = new Set([\"u\", \"l\", \"t\", \"m\", \"o\"] as const);\n\n if (variant !== undefined && !validVariants.has(variant)) {\n throw new Error(`Invalid Unicode letter variant: ${variant}`);\n }\n\n return this.add(`\\\\p{L${variant ?? \"\"}}`);\n }\n\n unicodeDigit(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{N}\");\n }\n\n unicodePunctuation(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{P}\");\n }\n\n unicodeSymbol(): Base {\n this.flags.add(Flags.UNICODE);\n return this.add(\"\\\\p{S}\");\n }\n\n repeat(count: number): Base {\n if (this.parts.length === 0) {\n throw new Error(\"No pattern to repeat\");\n }\n\n const lastPart = this.parts.pop();\n this.parts.push(`(${lastPart}){${count}}`);\n return this;\n }\n\n ipv4Octet(): Base {\n return this.add(\"(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)\");\n }\n\n protocol(): Base {\n return this.add(\"https?://\");\n }\n\n www(): Base {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): Base {\n return this.add(\"(com|org|net)\");\n }\n\n path(): Base {\n return this.add(\"(/\\\\w+)*\");\n }\n\n private add(part: string): this {\n this.parts.push(part);\n return this;\n }\n\n toString(): string {\n return this.parts.join(\"\");\n }\n\n toRegExp(): RegExp {\n return new RegExp(this.toString(), [...this.flags].join(\"\"));\n }\n}\n\nfunction escapeLiteral(text: string): string {\n if (!escapeCache.has(text)) {\n escapeCache.set(text, text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n }\n return escapeCache.get(text)!;\n}\n\nconst createRegex = (): AtStart => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (\n builder: () => PartialBut<HumanRegex, \"toRegExp\">\n ) => {\n const regex = builder().toRegExp();\n return () => new RegExp(regex.source, regex.flags);\n };\n\n return {\n email: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .word()\n .oneOrMore()\n .literal(\"@\")\n .word()\n .oneOrMore()\n .startGroup()\n .literal(\".\")\n .word()\n .oneOrMore()\n .endGroup()\n .zeroOrMore()\n .literal(\".\")\n .letter()\n .atLeast(2)\n .endAnchor()\n ),\n url: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .protocol()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .endAnchor()\n ),\n phoneInternational: createCachedPattern(() =>\n createRegex()\n .startAnchor()\n .literal(\"+\")\n .digit()\n .between(1, 3)\n .literal(\"-\")\n .digit()\n .between(3, 14)\n .endAnchor()\n ),\n };\n})();\n\nexport { createRegex, Patterns, Flags, Ranges, Quantifiers };\n"],"names":["escapeCache","Map","Flags","GLOBAL","NON_SENSITIVE","MULTILINE","DOT_ALL","UNICODE","STICKY","Ranges","Object","freeze","digit","lowercaseLetter","uppercaseLetter","letter","alphanumeric","anyCharacter","Quantifiers","zeroOrMore","oneOrMore","optional","HumanRegex","constructor","this","parts","flags","Set","add","special","word","whitespace","nonWhitespace","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","notRange","chars","lazy","lastPart","pop","negativeLookahead","pattern","positiveLookahead","positiveLookbehind","negativeLookbehind","hasSpecialCharacter","hasDigit","hasLetter","exactly","n","atLeast","atMost","between","min","max","startNamedGroup","startGroup","startCaptureGroup","wordBoundary","nonWordBoundary","endGroup","startAnchor","endAnchor","global","nonSensitive","multiline","dotAll","sticky","unicodeChar","variant","validVariants","undefined","unicodeDigit","unicodePunctuation","unicodeSymbol","repeat","count","length","push","ipv4Octet","protocol","www","tld","path","part","toString","join","toRegExp","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","source","email","url","phoneInternational"],"mappings":"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"} |
+97
-63
@@ -0,17 +1,19 @@ | ||
| // Constants | ||
| export const Flags: { | ||
| GLOBAL: string; | ||
| NON_SENSITIVE: string; | ||
| MULTILINE: string; | ||
| DOT_ALL: string; | ||
| UNICODE: string; | ||
| STICKY: string; | ||
| GLOBAL: "g"; | ||
| NON_SENSITIVE: "i"; | ||
| MULTILINE: "m"; | ||
| DOT_ALL: "s"; | ||
| UNICODE: "u"; | ||
| STICKY: "y"; | ||
| }; | ||
| export declare const Ranges: { | ||
| digit: string; | ||
| lowercaseLetter: string; | ||
| uppercaseLetter: string; | ||
| letter: string; | ||
| alphanumeric: string; | ||
| anyCharacter: string; | ||
| export const Ranges: { | ||
| digit: "0-9"; | ||
| lowercaseLetter: "a-z"; | ||
| uppercaseLetter: "A-Z"; | ||
| letter: "a-zA-Z"; | ||
| alphanumeric: "a-zA-Z0-9"; | ||
| anyCharacter: "."; | ||
| }; | ||
@@ -21,8 +23,29 @@ | ||
| export interface Quantifiers { | ||
| zeroOrMore: string; | ||
| oneOrMore: string; | ||
| optional: string; | ||
| } | ||
| export const Quantifiers: { | ||
| zeroOrMore: "*"; | ||
| oneOrMore: "+"; | ||
| optional: "?"; | ||
| }; | ||
| // The type of quantifier operators used in chain methods | ||
| export type QuantifiersType = | ||
| | "exactly" | ||
| | "atLeast" | ||
| | "atMost" | ||
| | "between" | ||
| | "oneOrMore" | ||
| | "zeroOrMore" | ||
| | "repeat"; | ||
| export type QuantifierMethods = QuantifiersType | "optional" | "lazy"; | ||
| // Helper chainable types – they “narrow” the available methods at each stage. | ||
| export type WithLazy = HumanRegex; | ||
| export type Base = Omit<HumanRegex, "lazy">; | ||
| export type AtStart = Omit<Base, QuantifierMethods | "endGroup">; | ||
| export type AfterAnchor = Omit<Base, QuantifierMethods | "or">; | ||
| export type SimpleQuantifier = Omit<Base, QuantifiersType>; | ||
| export type LazyQuantifier = Omit<HumanRegex, QuantifiersType>; | ||
| // Main class | ||
| export class HumanRegex { | ||
@@ -34,43 +57,50 @@ private parts: string[]; | ||
| digit(): this; | ||
| special(): this; | ||
| word(): this; | ||
| whitespace(): this; | ||
| nonWhitespace(): this; | ||
| // Basic pattern methods | ||
| digit(): Base; | ||
| special(): Base; | ||
| word(): Base; | ||
| whitespace(): Base; | ||
| nonWhitespace(): Base; | ||
| literal(text: string): this; | ||
| or(): this; | ||
| or(): AfterAnchor; | ||
| range(name: RangeKeys): this; | ||
| notRange(chars: string): this; | ||
| letter(): this; | ||
| anyCharacter(): this; | ||
| range(name: RangeKeys): Base; | ||
| notRange(chars: string): Base; | ||
| lazy(): Base; | ||
| letter(): Base; | ||
| anyCharacter(): Base; | ||
| exactly(n: number): this; | ||
| atLeast(n: number): this; | ||
| atMost(n: number): this; | ||
| between(min: number, max: number): this; | ||
| oneOrMore(): this; | ||
| optional(): this; | ||
| zeroOrMore(): this; | ||
| lazy(): this; | ||
| // Lookahead/behind | ||
| negativeLookahead(pattern: string): Base; | ||
| positiveLookahead(pattern: string): Base; | ||
| positiveLookbehind(pattern: string): Base; | ||
| negativeLookbehind(pattern: string): Base; | ||
| startGroup(): this; | ||
| startCaptureGroup(): this; | ||
| startNamedGroup(name: string): this; | ||
| endGroup(): this; | ||
| // “Has” assertions | ||
| hasSpecialCharacter(): Base; | ||
| hasDigit(): Base; | ||
| hasLetter(): Base; | ||
| wordBoundary(): this; | ||
| nonWordBoundary(): this; | ||
| startAnchor(): this; | ||
| endAnchor(): this; | ||
| // Quantifiers | ||
| optional(): SimpleQuantifier; | ||
| exactly(n: number): SimpleQuantifier; | ||
| atLeast(n: number): LazyQuantifier; | ||
| atMost(n: number): LazyQuantifier; | ||
| between(min: number, max: number): LazyQuantifier; | ||
| oneOrMore(): LazyQuantifier; | ||
| zeroOrMore(): LazyQuantifier; | ||
| negativeLookahead(pattern: string): this; | ||
| positiveLookahead(pattern: string): this; | ||
| positiveLookbehind(pattern: string): this; | ||
| negativeLookbehind(pattern: string): this; | ||
| // Grouping | ||
| startNamedGroup(name: string): AfterAnchor; | ||
| startGroup(): AfterAnchor; | ||
| startCaptureGroup(): AfterAnchor; | ||
| wordBoundary(): Base; | ||
| nonWordBoundary(): Base; | ||
| endGroup(): Base; | ||
| hasSpecialCharacter(): this; | ||
| hasDigit(): this; | ||
| hasLetter(): this; | ||
| // Anchors | ||
| startAnchor(): AfterAnchor; | ||
| endAnchor(): AfterAnchor; | ||
| // Flags | ||
| global(): this; | ||
@@ -82,15 +112,16 @@ nonSensitive(): this; | ||
| unicodeChar(variant?: "u" | "l" | "t" | "m" | "o"): this; | ||
| unicodeDigit(): this; | ||
| unicodePunctuation(): this; | ||
| unicodeSymbol(): this; | ||
| // Unicode properties | ||
| unicodeChar(variant?: "u" | "l" | "t" | "m" | "o"): Base; | ||
| unicodeDigit(): Base; | ||
| unicodePunctuation(): Base; | ||
| unicodeSymbol(): Base; | ||
| repeat(count: number): this; | ||
| ipv4Octet(): this; | ||
| // Extra helpers | ||
| repeat(count: number): Base; | ||
| ipv4Octet(): Base; | ||
| protocol(): Base; | ||
| www(): Base; | ||
| tld(): Base; | ||
| path(): Base; | ||
| protocol(): this; | ||
| www(): this; | ||
| tld(): this; | ||
| path(): this; | ||
| toString(): string; | ||
@@ -100,4 +131,6 @@ toRegExp(): RegExp; | ||
| export function createRegex(): HumanRegex; | ||
| // The starting point of the builder returns an AtStart (a subset of HumanRegex) | ||
| export function createRegex(): AtStart; | ||
| // Cached patterns | ||
| export const Patterns: { | ||
@@ -109,2 +142,3 @@ email: () => RegExp; | ||
| // Utility function for escaping literals | ||
| export function escapeLiteral(text: string): string; |
+5
-1
| { | ||
| "name": "human-regex", | ||
| "version": "2.1.4", | ||
| "version": "2.1.5", | ||
| "description": "Human-friendly regex builder with English-like syntax", | ||
@@ -31,2 +31,6 @@ "main": "dist/human-regex.cjs.js", | ||
| "url": "https://github.com/busyboxkitty" | ||
| }, | ||
| { | ||
| "name": "Marlon Evangelista", | ||
| "url": "https://github.com/MForMarlon" | ||
| } | ||
@@ -33,0 +37,0 @@ ], |
+1
-1
@@ -97,3 +97,3 @@ [](https://www.npmjs.com/package/human-regex) | ||
| | `.range("digit")` | Adds a range pattern for digits (`0-9`). | `[0-9]` | | ||
| | `.notRange("aeiou")` | Adds a range pattern for digits (`0-9`). | `[0-9]` | | ||
| | `.notRange("aeiou")` | Excludes characters from the pattern. | `[^aeiou]` | | ||
@@ -100,0 +100,0 @@ ### Quantifiers |
47027
2.64%148
26.5%