I\'m still a beginner at regex so this is a little above me currently.
I need to validate a number input to two characters and it can\'t be more than the value 12.
For something like this (testing if an integer is less than a given value), you should really not use a regex.
Instead, just use a simple condition like this one (the syntax will depend on the language you're working with) :
if ($variable <= 12) {
// OK
}
else {
// Not OK
}
Regex is not suited to dealing with ranges like this, but anyway this should work:
/^(0?[1-9]|1[012])$/
Description:
^ match start of the string
(0? optional zero
[1-9] any number between 1 and 9
|1[012]) or match 1 followed by either a 0, 1, 2 i.e. 10, 11, 12.
$ match end of string
For the "character either x, or y, or z, or ...", there's the character class, expressed in square brackets:
[012]
means "any character of 0
,1
, or 2
".
0[0-9]|1[0-2]
Description:
[0-9] : number between 00 and 09
| : or
1[0-2] : and if starting with 1, next number should be between 0 -1 (testing 10-12)
(0[0-9])|(1[0-2])
this matches a zero, followed by one arbitrary digit, or a one, followed by 0, 1 or 2
The following code (Groovy) creates a regex similar to the answer from @Gery Green but works for any given number:
String getSmallerNumberRegEx(String number) {
int length = number.length()
List<String> patterns = [];
if (length >= 2) {
patterns.add("\\d{1,${length - 1}}") // any number with less digits
}
for (int i = 0; i < number.length(); i++) {
def digit = number[i].toInteger()
if (digit > 0) {
// same prefix + smaller number + any postfix:
patterns.add("${number.substring(0, i)}[0-${digit - 1}]\\d{${length - i - 1}}")
}
}
return patterns.join('|')
}