🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

human-regex

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

human-regex - npm Package Compare versions

Comparing version
2.0.3
to
2.0.4
+1
-1
dist/human-regex.cjs.js

@@ -1,2 +0,2 @@

"use strict";const t=new Map,r={GLOBAL:"g",NON_SENSITIVE:"i",MULTILINE:"m",DOT_ALL:"s",UNICODE:"u",STICKY:"y"},e=Object.freeze({digit:"0-9",lowercaseLetter:"a-z",uppercaseLetter:"A-Z",letter:"a-zA-Z",alphanumeric:"a-zA-Z0-9",anyCharacter:"."}),n=Object.freeze({zeroOrMore:"*",oneOrMore:"+",optional:"?"});class a{constructor(){this.parts=[],this.flags=new Set}digit(){return this.add("\\d")}special(){return this.add("(?=.*[!@#$%^&*])")}word(){return this.add("\\w")}whitespace(){return this.add("\\s")}literal(r){return this.add(function(r){t.has(r)||t.set(r,r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.get(r)}(r))}or(){return this.add("|")}range(t){const r=e[t];if(!r)throw new Error(`Unknown range: ${t}`);return this.add(`[${r}]`)}letter(){return this.add("[a-zA-Z]")}exactly(t){return this.add(`{${t}}`)}atLeast(t){return this.add(`{${t},}`)}atMost(t){return this.add(`{0,${t}}`)}between(t,r){return this.add(`{${t},${r}}`)}oneOrMore(){return this.add(n.oneOrMore)}optional(){return this.add(n.optional)}zeroOrMore(){return this.add(n.zeroOrMore)}startGroup(){return this.add("(?:")}endGroup(){return this.add(")")}startAnchor(){return this.add("^")}endAnchor(){return this.add("$")}global(){return this.flags.add(r.GLOBAL),this}nonSensitive(){return this.flags.add(r.NON_SENSITIVE),this}protocol(){return this.add("https?://")}www(){return this.add("(www\\.)?")}tld(){return this.add("(com|org|net)")}path(){return this.add("(/\\w+)*")}add(t){return this.parts.push(t),this}toString(){return this.parts.join("")}toRegExp(){const t=this.toString();return new RegExp(t,[...this.flags].join(""))}}const o=()=>new a,s=(()=>{const t=t=>{const r=t().toRegExp();return()=>r};return{email:t((()=>o().startAnchor().word().oneOrMore().literal("@").word().oneOrMore().startGroup().literal(".").word().oneOrMore().endGroup().zeroOrMore().literal(".").letter().atLeast(2).endAnchor())),url:t((()=>o().startAnchor().protocol().optional().www().word().oneOrMore().literal(".").tld().path().optional().endAnchor())),phoneInternational:t((()=>o().startAnchor().literal("+").digit().between(1,3).literal("-").digit().between(3,14).endAnchor()))}})();exports.Flags=r,exports.Patterns=s,exports.Quantifiers=n,exports.Ranges=e,exports.createRegex=o;
"use strict";const t=new Map,r={GLOBAL:"g",NON_SENSITIVE:"i",MULTILINE:"m",DOT_ALL:"s",UNICODE:"u",STICKY:"y"},e=Object.freeze({digit:"0-9",lowercaseLetter:"a-z",uppercaseLetter:"A-Z",letter:"a-zA-Z",alphanumeric:"a-zA-Z0-9",anyCharacter:"."}),a=Object.freeze({zeroOrMore:"*",oneOrMore:"+",optional:"?"});class n{constructor(){this.parts=[],this.flags=new Set}digit(){return this.add("\\d")}special(){return this.add("(?=.*[!@#$%^&*])")}word(){return this.add("\\w")}whitespace(){return this.add("\\s")}literal(r){return this.add(function(r){t.has(r)||t.set(r,r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.get(r)}(r))}or(){return this.add("|")}range(t){const r=e[t];if(!r)throw new Error(`Unknown range: ${t}`);return this.add(`[${r}]`)}letter(){return this.add("[a-zA-Z]")}anyCharacter(){return this.add(".")}hasSpecialCharacter(){return this.add("(?=.*[!@#$%^&*])")}hasDigit(){return this.add("(?=.*\\d)")}hasLetter(){return this.add("(?=.*[a-zA-Z])")}exactly(t){return this.add(`{${t}}`)}atLeast(t){return this.add(`{${t},}`)}atMost(t){return this.add(`{0,${t}}`)}between(t,r){return this.add(`{${t},${r}}`)}oneOrMore(){return this.add(a.oneOrMore)}optional(){return this.add(a.optional)}zeroOrMore(){return this.add(a.zeroOrMore)}startGroup(){return this.add("(?:")}endGroup(){return this.add(")")}startAnchor(){return this.add("^")}endAnchor(){return this.add("$")}global(){return this.flags.add(r.GLOBAL),this}nonSensitive(){return this.flags.add(r.NON_SENSITIVE),this}protocol(){return this.add("https?://")}www(){return this.add("(www\\.)?")}tld(){return this.add("(com|org|net)")}path(){return this.add("(/\\w+)*")}add(t){return this.parts.push(t),this}toString(){return this.parts.join("")}toRegExp(){const t=this.toString();return new RegExp(t,[...this.flags].join(""))}}const s=()=>new n,o=(()=>{const t=t=>{const r=t().toRegExp();return()=>r};return{email:t((()=>s().startAnchor().word().oneOrMore().literal("@").word().oneOrMore().startGroup().literal(".").word().oneOrMore().endGroup().zeroOrMore().literal(".").letter().atLeast(2).endAnchor())),url:t((()=>s().startAnchor().protocol().optional().www().word().oneOrMore().literal(".").tld().path().optional().endAnchor())),phoneInternational:t((()=>s().startAnchor().literal("+").digit().between(1,3).literal("-").digit().between(3,14).endAnchor()))}})();exports.Flags=r,exports.Patterns=o,exports.Quantifiers=a,exports.Ranges=e,exports.createRegex=s;
//# sourceMappingURL=human-regex.cjs.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"human-regex.cjs.js","sources":["../src/human-regex.ts"],"sourcesContent":["// human-regex.js\n// Static cache for escaped literals\nconst escapeCache = new Map<string, string>();\n\n/**\n * Regex flags (optimized as Set-based)\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\n/**\n * Precomputed character ranges\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\n/**\n * Quantifier symbols\n */\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\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 // Core components\n digit(): this {\n return this.add(\"\\\\d\");\n }\n\n special(): this {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): this {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): this {\n return this.add(\"\\\\s\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): this {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): this {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n letter(): this {\n return this.add(\"[a-zA-Z]\");\n }\n\n // Quantifiers\n exactly(n: number): this {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): this {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): this {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): this {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): this {\n return this.add(Quantifiers.oneOrMore);\n }\n\n optional(): this {\n return this.add(Quantifiers.optional);\n }\n\n zeroOrMore(): this {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n // Grouping and anchors\n startGroup(): this {\n return this.add(\"(?:\");\n }\n\n endGroup(): this {\n return this.add(\")\");\n }\n\n startAnchor(): this {\n return this.add(\"^\");\n }\n\n endAnchor(): this {\n return this.add(\"$\");\n }\n\n // Flags (optimized string operations)\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 // Protocol optimization using optional 's'\n protocol(): this {\n return this.add(\"https?://\");\n }\n\n www(): this {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): this {\n return this.add(\"(com|org|net)\");\n }\n\n path(): this {\n return this.add(\"(/\\\\w+)*\");\n }\n\n // Internal methods\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 const pattern = this.toString();\n return new RegExp(pattern, [...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) as string;\n}\n\n/**\n * Memoized predefined patterns\n */\nconst createRegex = (): HumanRegex => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (builder: () => HumanRegex): (() => RegExp) => {\n const regex = builder().toRegExp();\n return () => regex;\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 .optional()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .optional()\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\n// Public API\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","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","exactly","n","atLeast","atMost","between","min","max","startGroup","endGroup","startAnchor","endAnchor","global","nonSensitive","protocol","www","tld","path","part","push","toString","join","toRegExp","pattern","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","email","url","phoneInternational"],"mappings":"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"}
{"version":3,"file":"human-regex.cjs.js","sources":["../src/human-regex.ts"],"sourcesContent":["// human-regex.ts\n// Static cache for escaped literals\nconst escapeCache = new Map<string, string>();\n\n/**\n * Regex flags (optimized as Set-based)\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\n/**\n * Precomputed character ranges\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\n/**\n * Quantifier symbols\n */\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\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 // Core components\n digit(): this {\n return this.add(\"\\\\d\");\n }\n\n special(): this {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): this {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): this {\n return this.add(\"\\\\s\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): this {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): this {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n letter(): this {\n return this.add(\"[a-zA-Z]\");\n }\n\n anyCharacter(): this {\n return this.add(\".\");\n }\n\n // Lookaheads for validation\n hasSpecialCharacter(): this {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n hasDigit(): this {\n return this.add(\"(?=.*\\\\d)\");\n }\n\n hasLetter(): this {\n return this.add(\"(?=.*[a-zA-Z])\");\n }\n\n // Quantifiers\n exactly(n: number): this {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): this {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): this {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): this {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): this {\n return this.add(Quantifiers.oneOrMore);\n }\n\n optional(): this {\n return this.add(Quantifiers.optional);\n }\n\n zeroOrMore(): this {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n // Grouping and anchors\n startGroup(): this {\n return this.add(\"(?:\");\n }\n\n endGroup(): this {\n return this.add(\")\");\n }\n\n startAnchor(): this {\n return this.add(\"^\");\n }\n\n endAnchor(): this {\n return this.add(\"$\");\n }\n\n // Flags (optimized string operations)\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 // Protocol optimization using optional 's'\n protocol(): this {\n return this.add(\"https?://\");\n }\n\n www(): this {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): this {\n return this.add(\"(com|org|net)\");\n }\n\n path(): this {\n return this.add(\"(/\\\\w+)*\");\n }\n\n // Internal methods\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 const pattern = this.toString();\n return new RegExp(pattern, [...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) as string;\n}\n\n/**\n * Memoized predefined patterns\n */\nconst createRegex = (): HumanRegex => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (builder: () => HumanRegex): (() => RegExp) => {\n const regex = builder().toRegExp();\n return () => regex;\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 .optional()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .optional()\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\n// Public API\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","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","hasSpecialCharacter","hasDigit","hasLetter","exactly","n","atLeast","atMost","between","min","max","startGroup","endGroup","startAnchor","endAnchor","global","nonSensitive","protocol","www","tld","path","part","push","toString","join","toRegExp","pattern","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","email","url","phoneInternational"],"mappings":"aAEA,MAAMA,EAAc,IAAIC,IAKlBC,EAAQ,CACZC,OAAQ,IACRC,cAAe,IACfC,UAAW,IACXC,QAAS,IACTC,QAAS,IACTC,OAAQ,KAMJC,EAASC,OAAOC,OAAO,CAC3BC,MAAO,MACPC,gBAAiB,MACjBC,gBAAiB,MACjBC,OAAQ,SACRC,aAAc,YACdC,aAAc,MAQVC,EAAcR,OAAOC,OAAO,CAChCQ,WAAY,IACZC,UAAW,IACXC,SAAU,MAGZ,MAAMC,EAIJ,WAAAC,GACEC,KAAKC,MAAQ,GACbD,KAAKE,MAAQ,IAAIC,IAInB,KAAAf,GACE,OAAOY,KAAKI,IAAI,OAGlB,OAAAC,GACE,OAAOL,KAAKI,IAAI,oBAGlB,IAAAE,GACE,OAAON,KAAKI,IAAI,OAGlB,UAAAG,GACE,OAAOP,KAAKI,IAAI,OAGlB,OAAAI,CAAQC,GACN,OAAOT,KAAKI,IA4HhB,SAAuBK,GAChBjC,EAAYkC,IAAID,IACnBjC,EAAYmC,IAAIF,EAAMA,EAAKG,QAAQ,sBAAuB,SAE5D,OAAOpC,EAAYqC,IAAIJ,EACzB,CAjIoBK,CAAcL,IAGhC,EAAAM,GACE,OAAOf,KAAKI,IAAI,KAGlB,KAAAY,CAAMC,GACJ,MAAMD,EAAQ/B,EAAOgC,GACrB,IAAKD,EAAO,MAAM,IAAIE,MAAM,kBAAkBD,KAC9C,OAAOjB,KAAKI,IAAI,IAAIY,MAGtB,MAAAzB,GACE,OAAOS,KAAKI,IAAI,YAGlB,YAAAX,GACE,OAAOO,KAAKI,IAAI,KAIlB,mBAAAe,GACE,OAAOnB,KAAKI,IAAI,oBAGlB,QAAAgB,GACE,OAAOpB,KAAKI,IAAI,aAGlB,SAAAiB,GACE,OAAOrB,KAAKI,IAAI,kBAIlB,OAAAkB,CAAQC,GACN,OAAOvB,KAAKI,IAAI,IAAImB,MAGtB,OAAAC,CAAQD,GACN,OAAOvB,KAAKI,IAAI,IAAImB,OAGtB,MAAAE,CAAOF,GACL,OAAOvB,KAAKI,IAAI,MAAMmB,MAGxB,OAAAG,CAAQC,EAAaC,GACnB,OAAO5B,KAAKI,IAAI,IAAIuB,KAAOC,MAG7B,SAAAhC,GACE,OAAOI,KAAKI,IAAIV,EAAYE,WAG9B,QAAAC,GACE,OAAOG,KAAKI,IAAIV,EAAYG,UAG9B,UAAAF,GACE,OAAOK,KAAKI,IAAIV,EAAYC,YAI9B,UAAAkC,GACE,OAAO7B,KAAKI,IAAI,OAGlB,QAAA0B,GACE,OAAO9B,KAAKI,IAAI,KAGlB,WAAA2B,GACE,OAAO/B,KAAKI,IAAI,KAGlB,SAAA4B,GACE,OAAOhC,KAAKI,IAAI,KAIlB,MAAA6B,GAEE,OADAjC,KAAKE,MAAME,IAAI1B,EAAMC,QACdqB,KAGT,YAAAkC,GAEE,OADAlC,KAAKE,MAAME,IAAI1B,EAAME,eACdoB,KAIT,QAAAmC,GACE,OAAOnC,KAAKI,IAAI,aAGlB,GAAAgC,GACE,OAAOpC,KAAKI,IAAI,aAGlB,GAAAiC,GACE,OAAOrC,KAAKI,IAAI,iBAGlB,IAAAkC,GACE,OAAOtC,KAAKI,IAAI,YAIV,GAAAA,CAAImC,GAEV,OADAvC,KAAKC,MAAMuC,KAAKD,GACTvC,KAGT,QAAAyC,GACE,OAAOzC,KAAKC,MAAMyC,KAAK,IAGzB,QAAAC,GACE,MAAMC,EAAU5C,KAAKyC,WACrB,OAAO,IAAII,OAAOD,EAAS,IAAI5C,KAAKE,OAAOwC,KAAK,MAc9C,MAAAI,EAAc,IAAkB,IAAIhD,EAEpCiD,EAAW,MACf,MAAMC,EAAuBC,IAC3B,MAAMC,EAAQD,IAAUN,WACxB,MAAO,IAAMO,CAAK,EAGpB,MAAO,CACLC,MAAOH,GAAoB,IACzBF,IACGf,cACAzB,OACAV,YACAY,QAAQ,KACRF,OACAV,YACAiC,aACArB,QAAQ,KACRF,OACAV,YACAkC,WACAnC,aACAa,QAAQ,KACRjB,SACAiC,QAAQ,GACRQ,cAELoB,IAAKJ,GAAoB,IACvBF,IACGf,cACAI,WACAtC,WACAuC,MACA9B,OACAV,YACAY,QAAQ,KACR6B,MACAC,OACAzC,WACAmC,cAELqB,mBAAoBL,GAAoB,IACtCF,IACGf,cACAvB,QAAQ,KACRpB,QACAsC,QAAQ,EAAG,GACXlB,QAAQ,KACRpB,QACAsC,QAAQ,EAAG,IACXM,cAGR,EApDgB"}

@@ -1,2 +0,2 @@

const t=new Map,r={GLOBAL:"g",NON_SENSITIVE:"i",MULTILINE:"m",DOT_ALL:"s",UNICODE:"u",STICKY:"y"},e=Object.freeze({digit:"0-9",lowercaseLetter:"a-z",uppercaseLetter:"A-Z",letter:"a-zA-Z",alphanumeric:"a-zA-Z0-9",anyCharacter:"."}),n=Object.freeze({zeroOrMore:"*",oneOrMore:"+",optional:"?"});class o{constructor(){this.parts=[],this.flags=new Set}digit(){return this.add("\\d")}special(){return this.add("(?=.*[!@#$%^&*])")}word(){return this.add("\\w")}whitespace(){return this.add("\\s")}literal(r){return this.add(function(r){t.has(r)||t.set(r,r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.get(r)}(r))}or(){return this.add("|")}range(t){const r=e[t];if(!r)throw new Error(`Unknown range: ${t}`);return this.add(`[${r}]`)}letter(){return this.add("[a-zA-Z]")}exactly(t){return this.add(`{${t}}`)}atLeast(t){return this.add(`{${t},}`)}atMost(t){return this.add(`{0,${t}}`)}between(t,r){return this.add(`{${t},${r}}`)}oneOrMore(){return this.add(n.oneOrMore)}optional(){return this.add(n.optional)}zeroOrMore(){return this.add(n.zeroOrMore)}startGroup(){return this.add("(?:")}endGroup(){return this.add(")")}startAnchor(){return this.add("^")}endAnchor(){return this.add("$")}global(){return this.flags.add(r.GLOBAL),this}nonSensitive(){return this.flags.add(r.NON_SENSITIVE),this}protocol(){return this.add("https?://")}www(){return this.add("(www\\.)?")}tld(){return this.add("(com|org|net)")}path(){return this.add("(/\\w+)*")}add(t){return this.parts.push(t),this}toString(){return this.parts.join("")}toRegExp(){const t=this.toString();return new RegExp(t,[...this.flags].join(""))}}const a=()=>new o,d=(()=>{const t=t=>{const r=t().toRegExp();return()=>r};return{email:t((()=>a().startAnchor().word().oneOrMore().literal("@").word().oneOrMore().startGroup().literal(".").word().oneOrMore().endGroup().zeroOrMore().literal(".").letter().atLeast(2).endAnchor())),url:t((()=>a().startAnchor().protocol().optional().www().word().oneOrMore().literal(".").tld().path().optional().endAnchor())),phoneInternational:t((()=>a().startAnchor().literal("+").digit().between(1,3).literal("-").digit().between(3,14).endAnchor()))}})();export{r as Flags,d as Patterns,n as Quantifiers,e as Ranges,a as createRegex};
const t=new Map,r={GLOBAL:"g",NON_SENSITIVE:"i",MULTILINE:"m",DOT_ALL:"s",UNICODE:"u",STICKY:"y"},e=Object.freeze({digit:"0-9",lowercaseLetter:"a-z",uppercaseLetter:"A-Z",letter:"a-zA-Z",alphanumeric:"a-zA-Z0-9",anyCharacter:"."}),n=Object.freeze({zeroOrMore:"*",oneOrMore:"+",optional:"?"});class a{constructor(){this.parts=[],this.flags=new Set}digit(){return this.add("\\d")}special(){return this.add("(?=.*[!@#$%^&*])")}word(){return this.add("\\w")}whitespace(){return this.add("\\s")}literal(r){return this.add(function(r){t.has(r)||t.set(r,r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.get(r)}(r))}or(){return this.add("|")}range(t){const r=e[t];if(!r)throw new Error(`Unknown range: ${t}`);return this.add(`[${r}]`)}letter(){return this.add("[a-zA-Z]")}anyCharacter(){return this.add(".")}hasSpecialCharacter(){return this.add("(?=.*[!@#$%^&*])")}hasDigit(){return this.add("(?=.*\\d)")}hasLetter(){return this.add("(?=.*[a-zA-Z])")}exactly(t){return this.add(`{${t}}`)}atLeast(t){return this.add(`{${t},}`)}atMost(t){return this.add(`{0,${t}}`)}between(t,r){return this.add(`{${t},${r}}`)}oneOrMore(){return this.add(n.oneOrMore)}optional(){return this.add(n.optional)}zeroOrMore(){return this.add(n.zeroOrMore)}startGroup(){return this.add("(?:")}endGroup(){return this.add(")")}startAnchor(){return this.add("^")}endAnchor(){return this.add("$")}global(){return this.flags.add(r.GLOBAL),this}nonSensitive(){return this.flags.add(r.NON_SENSITIVE),this}protocol(){return this.add("https?://")}www(){return this.add("(www\\.)?")}tld(){return this.add("(com|org|net)")}path(){return this.add("(/\\w+)*")}add(t){return this.parts.push(t),this}toString(){return this.parts.join("")}toRegExp(){const t=this.toString();return new RegExp(t,[...this.flags].join(""))}}const o=()=>new a,d=(()=>{const t=t=>{const r=t().toRegExp();return()=>r};return{email:t((()=>o().startAnchor().word().oneOrMore().literal("@").word().oneOrMore().startGroup().literal(".").word().oneOrMore().endGroup().zeroOrMore().literal(".").letter().atLeast(2).endAnchor())),url:t((()=>o().startAnchor().protocol().optional().www().word().oneOrMore().literal(".").tld().path().optional().endAnchor())),phoneInternational:t((()=>o().startAnchor().literal("+").digit().between(1,3).literal("-").digit().between(3,14).endAnchor()))}})();export{r as Flags,d as Patterns,n as Quantifiers,e as Ranges,o as createRegex};
//# sourceMappingURL=human-regex.esm.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"human-regex.esm.js","sources":["../src/human-regex.ts"],"sourcesContent":["// human-regex.js\n// Static cache for escaped literals\nconst escapeCache = new Map<string, string>();\n\n/**\n * Regex flags (optimized as Set-based)\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\n/**\n * Precomputed character ranges\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\n/**\n * Quantifier symbols\n */\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\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 // Core components\n digit(): this {\n return this.add(\"\\\\d\");\n }\n\n special(): this {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): this {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): this {\n return this.add(\"\\\\s\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): this {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): this {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n letter(): this {\n return this.add(\"[a-zA-Z]\");\n }\n\n // Quantifiers\n exactly(n: number): this {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): this {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): this {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): this {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): this {\n return this.add(Quantifiers.oneOrMore);\n }\n\n optional(): this {\n return this.add(Quantifiers.optional);\n }\n\n zeroOrMore(): this {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n // Grouping and anchors\n startGroup(): this {\n return this.add(\"(?:\");\n }\n\n endGroup(): this {\n return this.add(\")\");\n }\n\n startAnchor(): this {\n return this.add(\"^\");\n }\n\n endAnchor(): this {\n return this.add(\"$\");\n }\n\n // Flags (optimized string operations)\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 // Protocol optimization using optional 's'\n protocol(): this {\n return this.add(\"https?://\");\n }\n\n www(): this {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): this {\n return this.add(\"(com|org|net)\");\n }\n\n path(): this {\n return this.add(\"(/\\\\w+)*\");\n }\n\n // Internal methods\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 const pattern = this.toString();\n return new RegExp(pattern, [...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) as string;\n}\n\n/**\n * Memoized predefined patterns\n */\nconst createRegex = (): HumanRegex => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (builder: () => HumanRegex): (() => RegExp) => {\n const regex = builder().toRegExp();\n return () => regex;\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 .optional()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .optional()\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\n// Public API\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","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","exactly","n","atLeast","atMost","between","min","max","startGroup","endGroup","startAnchor","endAnchor","global","nonSensitive","protocol","www","tld","path","part","push","toString","join","toRegExp","pattern","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","email","url","phoneInternational"],"mappings":"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"}
{"version":3,"file":"human-regex.esm.js","sources":["../src/human-regex.ts"],"sourcesContent":["// human-regex.ts\n// Static cache for escaped literals\nconst escapeCache = new Map<string, string>();\n\n/**\n * Regex flags (optimized as Set-based)\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\n/**\n * Precomputed character ranges\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\n/**\n * Quantifier symbols\n */\nconst Quantifiers = Object.freeze({\n zeroOrMore: \"*\",\n oneOrMore: \"+\",\n optional: \"?\",\n});\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 // Core components\n digit(): this {\n return this.add(\"\\\\d\");\n }\n\n special(): this {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n word(): this {\n return this.add(\"\\\\w\");\n }\n\n whitespace(): this {\n return this.add(\"\\\\s\");\n }\n\n literal(text: string): this {\n return this.add(escapeLiteral(text));\n }\n\n or(): this {\n return this.add(\"|\");\n }\n\n range(name: RangeKeys): this {\n const range = Ranges[name];\n if (!range) throw new Error(`Unknown range: ${name}`);\n return this.add(`[${range}]`);\n }\n\n letter(): this {\n return this.add(\"[a-zA-Z]\");\n }\n\n anyCharacter(): this {\n return this.add(\".\");\n }\n\n // Lookaheads for validation\n hasSpecialCharacter(): this {\n return this.add(\"(?=.*[!@#$%^&*])\");\n }\n\n hasDigit(): this {\n return this.add(\"(?=.*\\\\d)\");\n }\n\n hasLetter(): this {\n return this.add(\"(?=.*[a-zA-Z])\");\n }\n\n // Quantifiers\n exactly(n: number): this {\n return this.add(`{${n}}`);\n }\n\n atLeast(n: number): this {\n return this.add(`{${n},}`);\n }\n\n atMost(n: number): this {\n return this.add(`{0,${n}}`);\n }\n\n between(min: number, max: number): this {\n return this.add(`{${min},${max}}`);\n }\n\n oneOrMore(): this {\n return this.add(Quantifiers.oneOrMore);\n }\n\n optional(): this {\n return this.add(Quantifiers.optional);\n }\n\n zeroOrMore(): this {\n return this.add(Quantifiers.zeroOrMore);\n }\n\n // Grouping and anchors\n startGroup(): this {\n return this.add(\"(?:\");\n }\n\n endGroup(): this {\n return this.add(\")\");\n }\n\n startAnchor(): this {\n return this.add(\"^\");\n }\n\n endAnchor(): this {\n return this.add(\"$\");\n }\n\n // Flags (optimized string operations)\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 // Protocol optimization using optional 's'\n protocol(): this {\n return this.add(\"https?://\");\n }\n\n www(): this {\n return this.add(\"(www\\\\.)?\");\n }\n\n tld(): this {\n return this.add(\"(com|org|net)\");\n }\n\n path(): this {\n return this.add(\"(/\\\\w+)*\");\n }\n\n // Internal methods\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 const pattern = this.toString();\n return new RegExp(pattern, [...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) as string;\n}\n\n/**\n * Memoized predefined patterns\n */\nconst createRegex = (): HumanRegex => new HumanRegex();\n\nconst Patterns = (() => {\n const createCachedPattern = (builder: () => HumanRegex): (() => RegExp) => {\n const regex = builder().toRegExp();\n return () => regex;\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 .optional()\n .www()\n .word()\n .oneOrMore()\n .literal(\".\")\n .tld()\n .path()\n .optional()\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\n// Public API\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","literal","text","has","set","replace","get","escapeLiteral","or","range","name","Error","hasSpecialCharacter","hasDigit","hasLetter","exactly","n","atLeast","atMost","between","min","max","startGroup","endGroup","startAnchor","endAnchor","global","nonSensitive","protocol","www","tld","path","part","push","toString","join","toRegExp","pattern","RegExp","createRegex","Patterns","createCachedPattern","builder","regex","email","url","phoneInternational"],"mappings":"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"}

@@ -41,2 +41,3 @@ export interface Flags {

letter(): this;
anyCharacter(): this;

@@ -43,0 +44,0 @@ exactly(n: number): this;

{
"name": "human-regex",
"version": "2.0.3",
"version": "2.0.4",
"description": "Human-friendly regex builder with English-like syntax",

@@ -5,0 +5,0 @@ "main": "dist/human-regex.cjs.js",

+117
-28

@@ -9,2 +9,29 @@ [![npm version](https://img.shields.io/npm/v/human-regex.svg)](https://www.npmjs.com/package/human-regex)

## Features
- 🧩 Intuitive builder pattern with chainable methods
- 🎯 Prebuilt validators for common patterns (emails, URLs, phone numbers)
- 📚 Comprehensive character classes and quantifiers
- 🛡️ Type-safe implementation with TypeScript
- ⚡ Memoized patterns for better performance
- 🔍 Supports all standard regex flags
## Table of Contents
- [Installation](#installation)
- [Usage](#usage)
- [Basic Example](#basic-example)
- [Predefined Patterns](#predefined-patterns)
- [Comprehensive API Reference](#comprehensive-api-reference)
- [Core Methods](#core-methods)
- [Quantifiers](#quantifiers)
- [Anchors & Groups](#anchors--groups)
- [Validation Helpers](#validation-helpers)
- [URL Components](#url-components)
- [Flags](#flags)
- [Predefined Patterns](#predefined-patterns)
- [Examples](#examples)
- [Contributing](#contributing)
- [License](#license)
## Installation

@@ -18,16 +45,38 @@

### Basic Example
```javascript
import { createRegex } from "human-regex";
// Simple password validation
// Password validation: 8+ chars with special character, digit, and letter
const passwordRegex = createRegex()
.digit() // Must contain digit
.special() // Must contain special char
.range("alphanumeric") // Must contain alphanumeric char
.atLeast(8) // Must be at least 8 characters long
.toRegExp(); // Convert to RegExp object
.startAnchor()
.hasSpecialCharacter()
.hasDigit()
.hasLetter()
.anyCharacter()
.atLeast(8)
.endAnchor()
.toRegExp();
console.log(passwordRegex.test("P@ssw0rd")); // true
```
## API Reference
### Predefined Patterns
```javascript
import { Patterns } from "human-regex";
// Email validation
console.log(Patterns.email().test("test@example.com")); // true
// International phone number
console.log(Patterns.phoneInternational().test("+123-4567890")); // true
// URL validation
console.log(Patterns.url().test("https://www.example.com/path")); // true
```
## Comprehensive API Reference
### `createRegex()`

@@ -37,25 +86,65 @@

### Methods
### Core Methods
- `.literal(text: string)`: Adds a literal string to the pattern.
- `.digit()`: Adds a digit pattern (`\d`).
- `.word()`: Adds a word character pattern (`\w`).
- `.range(name: string)`: Adds a predefined character range.
- `.atLeast(n: number)`: Specifies that the preceding element must appear at least `n` times.
- `.exactly(n: number)`: Specifies that the preceding element must appear exactly `n` times.
- `.oneOrMore()`: Specifies that the preceding element must appear one or more times.
- `.optional()`: Specifies that the preceding element is optional.
- `.zeroOrMore()`: Specifies that the preceding element can appear zero or more times.
- `.startGroup()`: Starts a non-capturing group.
- `.endGroup()`: Ends a non-capturing group.
- `.startAnchor()`: Adds a start-of-string anchor (`^`).
- `.endAnchor()`: Adds an end-of-string anchor (`$`).
- `.global()`: Adds the global flag (`g`).
- `.nonSensitive()`: Adds the case-insensitive flag (`i`).
- `.multiline()`: Adds the multiline flag (`m`).
- `.dotAll()`: Adds the dot-all flag (`s`).
- `.unicode()`: Adds the Unicode flag (`u`).
- `.sticky()`: Adds the sticky flag (`y`).
- `.toRegExp()`: Converts the builder to a `RegExp` object.
| Method | Description | Example Output |
| ------------------ | ------------------------------------------- | -------------- | ---- |
| `.digit()` | Adds a digit pattern (`\d`). | `\d` |
| `.word()` | Adds a word character pattern (`\w`). | `\w` |
| `.whitespace()` | Adds a whitespace character pattern (`\s`). | `\s` |
| `.anyCharacter()` | Adds a pattern for any character (`.`). | `.` |
| `.literal("text")` | Adds a literal text pattern. | `["text"]` |
| `.or()` | Adds an OR pattern (` | `). | `\|` |
| `.range("digit")` | Adds a range pattern for digits (`0-9`). | `[0-9]` |
### Quantifiers
| Method | Description | Example Output |
| -------------------- | -------------------------------------- | -------------- |
| `.exactly(n)` | Adds an exact quantifier (`{n}`). | `{n}` |
| `.atLeast(n)` | Adds a minimum quantifier (`{n,}`). | `{n,}` |
| `.atMost(n)` | Adds a maximum quantifier (`{0,n}`). | `{0,n}` |
| `.between(min, max)` | Adds a range quantifier (`{min,max}`). | `{min,max}` |
| `.oneOrMore()` | Adds a one-or-more quantifier (`+`). | `+` |
| `.optional()` | Adds an optional quantifier (`?`). | `?` |
| `.zeroOrMore()` | Adds a zero-or-more quantifier (`*`). | `*` |
### Anchors & Groups
| Method | Description | Example Output |
| ---------------- | ------------------------------------- | -------------- |
| `.startGroup()` | Starts a non-capturing group (`(?:`). | `(?:` |
| `.endGroup()` | Ends a group (`)`). | `)` |
| `.startAnchor()` | Adds a start anchor (`^`). | `^` |
| `.endAnchor()` | Adds an end anchor (`$`). | `$` |
### Validation Helpers
| Method | Description | Example Output |
| ------------------------ | ---------------------------------------- | ------------------ |
| `.hasSpecialCharacter()` | Adds a lookahead for special characters. | `(?=.*[!@#$%^&*])` |
| `.hasDigit()` | Adds a lookahead for digits. | `(?=.*\d)` |
| `.hasLetter()` | Adds a lookahead for letters. | `(?=.*[a-zA-Z])` |
### URL Components
| Method | Description | Example Output |
| ------------- | -------------------------------------- | -------------- | ------- | ----- | --- | ----- |
| `.protocol()` | Adds a protocol pattern (`https?://`). | `https?://` |
| `.www()` | Adds a www pattern (`(www\.)?`). | `(www\.)?` |
| `.tld()` | Adds a top-level domain pattern (`(com | org | net)`). | `(com | org | net)` |
| `.path()` | Adds a path pattern (`(/\w+)*`). | `(/\w+)*` |
### Flags
| Method | Description | Example Output |
| ----------------- | ------------------------------------- | -------------- |
| `.global()` | Adds the global flag (`g`). | `g` |
| `.nonSensitive()` | Adds the case-insensitive flag (`i`). | `i` |
### Predefined Patterns
- `Patterns.email`: Predefined email pattern.
- `Patterns.url`: Predefined URL pattern.
- `Patterns.phoneInternational`: Predefined international phone number pattern.
## Examples

@@ -62,0 +151,0 @@