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})|(&gt)|(&lt)|(&quot)|(&amp)+[;]?`
  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