regexes.go raw
1 package validator
2
3 import (
4 "regexp"
5 "sync"
6 )
7
8 const (
9 alphaRegexString = "^[a-zA-Z]+$"
10 alphaNumericRegexString = "^[a-zA-Z0-9]+$"
11 alphaUnicodeRegexString = "^[\\p{L}]+$"
12 alphaUnicodeNumericRegexString = "^[\\p{L}\\p{N}]+$"
13 numericRegexString = "^[-+]?[0-9]+(?:\\.[0-9]+)?$"
14 numberRegexString = "^[0-9]+$"
15 hexadecimalRegexString = "^(0[xX])?[0-9a-fA-F]+$"
16 hexColorRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
17 rgbRegexString = "^rgb\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*\\)$"
18 rgbaRegexString = "^rgba\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$"
19 hslRegexString = "^hsl\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*\\)$"
20 hslaRegexString = "^hsla\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$"
21 emailRegexString = "^(?:(?:(?:(?:[a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(?:\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|(?:(?:\\x22)(?:(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(?:\\x20|\\x09)+)?(?:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(\\x20|\\x09)+)?(?:\\x22))))@(?:(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
22 e164RegexString = "^\\+[1-9]?[0-9]{7,14}$"
23 base32RegexString = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=|[A-Z2-7]{8})$"
24 base64RegexString = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
25 base64URLRegexString = "^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2}==|[A-Za-z0-9-_]{3}=|[A-Za-z0-9-_]{4})$"
26 base64RawURLRegexString = "^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2,4})$"
27 iSBN10RegexString = "^(?:[0-9]{9}X|[0-9]{10})$"
28 iSBN13RegexString = "^(?:(?:97(?:8|9))[0-9]{10})$"
29 iSSNRegexString = "^(?:[0-9]{4}-[0-9]{3}[0-9X])$"
30 uUID3RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
31 uUID4RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
32 uUID5RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
33 uUIDRegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
34 uUID3RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-3[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
35 uUID4RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
36 uUID5RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-5[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
37 uUIDRFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
38 uLIDRegexString = "^(?i)[A-HJKMNP-TV-Z0-9]{26}$"
39 md4RegexString = "^[0-9a-f]{32}$"
40 md5RegexString = "^[0-9a-f]{32}$"
41 sha256RegexString = "^[0-9a-f]{64}$"
42 sha384RegexString = "^[0-9a-f]{96}$"
43 sha512RegexString = "^[0-9a-f]{128}$"
44 ripemd128RegexString = "^[0-9a-f]{32}$"
45 ripemd160RegexString = "^[0-9a-f]{40}$"
46 tiger128RegexString = "^[0-9a-f]{32}$"
47 tiger160RegexString = "^[0-9a-f]{40}$"
48 tiger192RegexString = "^[0-9a-f]{48}$"
49 aSCIIRegexString = "^[\x00-\x7F]*$"
50 printableASCIIRegexString = "^[\x20-\x7E]*$"
51 multibyteRegexString = "[^\x00-\x7F]"
52 dataURIRegexString = `^data:((?:\w+\/(?:([^;]|;[^;]).)+)?)`
53 latitudeRegexString = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"
54 longitudeRegexString = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
55 sSNRegexString = `^[0-9]{3}[ -]?(0[1-9]|[1-9][0-9])[ -]?([1-9][0-9]{3}|[0-9][1-9][0-9]{2}|[0-9]{2}[1-9][0-9]|[0-9]{3}[1-9])$`
56 hostnameRegexStringRFC952 = `^[a-zA-Z]([a-zA-Z0-9\-]+[\.]?)*[a-zA-Z0-9]$` // https://tools.ietf.org/html/rfc952
57 hostnameRegexStringRFC1123 = `^([a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62}){1}(\.[a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})*?$` // accepts hostname starting with a digit https://tools.ietf.org/html/rfc1123
58 fqdnRegexStringRFC1123 = `^([a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})(\.[a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})*?(\.[a-zA-Z]{1}[a-zA-Z0-9]{0,62})\.?$` // same as hostnameRegexStringRFC1123 but must contain a non numerical TLD (possibly ending with '.')
59 btcAddressRegexString = `^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$` // bitcoin address
60 btcAddressUpperRegexStringBech32 = `^BC1[02-9AC-HJ-NP-Z]{7,76}$` // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32
61 btcAddressLowerRegexStringBech32 = `^bc1[02-9ac-hj-np-z]{7,76}$` // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32
62 ethAddressRegexString = `^0x[0-9a-fA-F]{40}$`
63 ethAddressUpperRegexString = `^0x[0-9A-F]{40}$`
64 ethAddressLowerRegexString = `^0x[0-9a-f]{40}$`
65 uRLEncodedRegexString = `^(?:[^%]|%[0-9A-Fa-f]{2})*$`
66 hTMLEncodedRegexString = `&#[x]?([0-9a-fA-F]{2})|(>)|(<)|(")|(&)+[;]?`
67 hTMLRegexString = `<[/]?([a-zA-Z]+).*?>`
68 jWTRegexString = "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$"
69 splitParamsRegexString = `'[^']*'|\S+`
70 bicRegexString = `^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$`
71 semverRegexString = `^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$` // numbered capture groups https://semver.org/
72 dnsRegexStringRFC1035Label = "^[a-z]([-a-z0-9]*[a-z0-9]){0,62}$"
73 cveRegexString = `^CVE-(1999|2\d{3})-(0[^0]\d{2}|0\d[^0]\d{1}|0\d{2}[^0]|[1-9]{1}\d{3,})$` // CVE Format Id https://cve.mitre.org/cve/identifiers/syntaxchange.html
74 mongodbIdRegexString = "^[a-f\\d]{24}$"
75 mongodbConnStringRegexString = "^mongodb(\\+srv)?:\\/\\/(([a-zA-Z\\d]+):([a-zA-Z\\d$:\\/?#\\[\\]@]+)@)?(([a-z\\d.-]+)(:[\\d]+)?)((,(([a-z\\d.-]+)(:(\\d+))?))*)?(\\/[a-zA-Z-_]{1,64})?(\\?(([a-zA-Z]+)=([a-zA-Z\\d]+))(&(([a-zA-Z\\d]+)=([a-zA-Z\\d]+))?)*)?$"
76 cronRegexString = `(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|((((\d+,)+\d+|((\*|\d+)(\/|-)\d+)|\d+|\*) ?){5,7})`
77 spicedbIDRegexString = `^(([a-zA-Z0-9/_|\-=+]{1,})|\*)$`
78 spicedbPermissionRegexString = "^([a-z][a-z0-9_]{1,62}[a-z0-9])?$"
79 spicedbTypeRegexString = "^([a-z][a-z0-9_]{1,61}[a-z0-9]/)?[a-z][a-z0-9_]{1,62}[a-z0-9]$"
80 )
81
82 func lazyRegexCompile(str string) func() *regexp.Regexp {
83 var regex *regexp.Regexp
84 var once sync.Once
85 return func() *regexp.Regexp {
86 once.Do(func() {
87 regex = regexp.MustCompile(str)
88 })
89 return regex
90 }
91 }
92
93 var (
94 alphaRegex = lazyRegexCompile(alphaRegexString)
95 alphaNumericRegex = lazyRegexCompile(alphaNumericRegexString)
96 alphaUnicodeRegex = lazyRegexCompile(alphaUnicodeRegexString)
97 alphaUnicodeNumericRegex = lazyRegexCompile(alphaUnicodeNumericRegexString)
98 numericRegex = lazyRegexCompile(numericRegexString)
99 numberRegex = lazyRegexCompile(numberRegexString)
100 hexadecimalRegex = lazyRegexCompile(hexadecimalRegexString)
101 hexColorRegex = lazyRegexCompile(hexColorRegexString)
102 rgbRegex = lazyRegexCompile(rgbRegexString)
103 rgbaRegex = lazyRegexCompile(rgbaRegexString)
104 hslRegex = lazyRegexCompile(hslRegexString)
105 hslaRegex = lazyRegexCompile(hslaRegexString)
106 e164Regex = lazyRegexCompile(e164RegexString)
107 emailRegex = lazyRegexCompile(emailRegexString)
108 base32Regex = lazyRegexCompile(base32RegexString)
109 base64Regex = lazyRegexCompile(base64RegexString)
110 base64URLRegex = lazyRegexCompile(base64URLRegexString)
111 base64RawURLRegex = lazyRegexCompile(base64RawURLRegexString)
112 iSBN10Regex = lazyRegexCompile(iSBN10RegexString)
113 iSBN13Regex = lazyRegexCompile(iSBN13RegexString)
114 iSSNRegex = lazyRegexCompile(iSSNRegexString)
115 uUID3Regex = lazyRegexCompile(uUID3RegexString)
116 uUID4Regex = lazyRegexCompile(uUID4RegexString)
117 uUID5Regex = lazyRegexCompile(uUID5RegexString)
118 uUIDRegex = lazyRegexCompile(uUIDRegexString)
119 uUID3RFC4122Regex = lazyRegexCompile(uUID3RFC4122RegexString)
120 uUID4RFC4122Regex = lazyRegexCompile(uUID4RFC4122RegexString)
121 uUID5RFC4122Regex = lazyRegexCompile(uUID5RFC4122RegexString)
122 uUIDRFC4122Regex = lazyRegexCompile(uUIDRFC4122RegexString)
123 uLIDRegex = lazyRegexCompile(uLIDRegexString)
124 md4Regex = lazyRegexCompile(md4RegexString)
125 md5Regex = lazyRegexCompile(md5RegexString)
126 sha256Regex = lazyRegexCompile(sha256RegexString)
127 sha384Regex = lazyRegexCompile(sha384RegexString)
128 sha512Regex = lazyRegexCompile(sha512RegexString)
129 ripemd128Regex = lazyRegexCompile(ripemd128RegexString)
130 ripemd160Regex = lazyRegexCompile(ripemd160RegexString)
131 tiger128Regex = lazyRegexCompile(tiger128RegexString)
132 tiger160Regex = lazyRegexCompile(tiger160RegexString)
133 tiger192Regex = lazyRegexCompile(tiger192RegexString)
134 aSCIIRegex = lazyRegexCompile(aSCIIRegexString)
135 printableASCIIRegex = lazyRegexCompile(printableASCIIRegexString)
136 multibyteRegex = lazyRegexCompile(multibyteRegexString)
137 dataURIRegex = lazyRegexCompile(dataURIRegexString)
138 latitudeRegex = lazyRegexCompile(latitudeRegexString)
139 longitudeRegex = lazyRegexCompile(longitudeRegexString)
140 sSNRegex = lazyRegexCompile(sSNRegexString)
141 hostnameRegexRFC952 = lazyRegexCompile(hostnameRegexStringRFC952)
142 hostnameRegexRFC1123 = lazyRegexCompile(hostnameRegexStringRFC1123)
143 fqdnRegexRFC1123 = lazyRegexCompile(fqdnRegexStringRFC1123)
144 btcAddressRegex = lazyRegexCompile(btcAddressRegexString)
145 btcUpperAddressRegexBech32 = lazyRegexCompile(btcAddressUpperRegexStringBech32)
146 btcLowerAddressRegexBech32 = lazyRegexCompile(btcAddressLowerRegexStringBech32)
147 ethAddressRegex = lazyRegexCompile(ethAddressRegexString)
148 uRLEncodedRegex = lazyRegexCompile(uRLEncodedRegexString)
149 hTMLEncodedRegex = lazyRegexCompile(hTMLEncodedRegexString)
150 hTMLRegex = lazyRegexCompile(hTMLRegexString)
151 jWTRegex = lazyRegexCompile(jWTRegexString)
152 splitParamsRegex = lazyRegexCompile(splitParamsRegexString)
153 bicRegex = lazyRegexCompile(bicRegexString)
154 semverRegex = lazyRegexCompile(semverRegexString)
155 dnsRegexRFC1035Label = lazyRegexCompile(dnsRegexStringRFC1035Label)
156 cveRegex = lazyRegexCompile(cveRegexString)
157 mongodbIdRegex = lazyRegexCompile(mongodbIdRegexString)
158 mongodbConnectionRegex = lazyRegexCompile(mongodbConnStringRegexString)
159 cronRegex = lazyRegexCompile(cronRegexString)
160 spicedbIDRegex = lazyRegexCompile(spicedbIDRegexString)
161 spicedbPermissionRegex = lazyRegexCompile(spicedbPermissionRegexString)
162 spicedbTypeRegex = lazyRegexCompile(spicedbTypeRegexString)
163 )
164