You want to match a hexadecimal number within a certain range of numbers. You want the regular expression to specify the range accurately, rather than just limiting the number of digits.
1 to C (1 to 12: hour or month):
^[1-9a-c]$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
1 to 18 (1 to 24: hour):
^(1[0-8]|[1-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
1 to 1F (1 to 31: day of the month):
^(1[0-9a-f]|[1-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
1 to 35 (1 to 53: week of the year):
^(3[0-5]|[12][0-9a-f]|[1-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
0 to 3B (0 to 59: minute or second):
^(3[0-9a-b]|[12]?[0-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
0 to 64 (0 to 100: percentage):
^(6[0-4]|[1-5]?[0-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
1 to 64 (1 to 100):
^(6[0-4]|[1-5][0-9a-f]|[1-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
20 to 7E (32 to 126: printable ASCII codes):
^(7[0-9a-e]|[2-6][0-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
0 to 7F (0 to 127: 7-bit number):
^[1-7]?[0-9a-f]$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
0 to FF (0 to 255: 8-bit number):
^[1-9a-f]?[0-9a-f]$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
1 to 16E (1 to 366: day of the year):
^(16[0-9a-e]|1[0-5][0-9a-f]|[1-9a-f][0-9a-f]?)$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
76C to 833 (1900 to 2099: year):
^(83[0-3]|8[0-2][0-9a-f]|7[7-9a-f][0-9a-f]|76[c-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
0 to 7FFF: (0 to 32767: 15-bit number):
^([1-7][0-9a-f]{3}|[1-9a-f][0-9a-f]{1,2}|[0-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
0 to FFFF: (0 to 65535: 16-bit number):
^([1-9a-f][0-9a-f]{1,3}|[0-9a-f])$
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
There’s no difference between matching decimal numeric ranges and hexadecimal numeric ranges with a regular expression. As the previous recipe explains, split the range into multiple ranges, until each range has a fixed number of positions with independent hexadecimal digits. Then it’s just a matter of using a character class for each position, and combining the ranges with alternation.
Since letters and digits occupy separate areas in the ASCII and
Unicode character tables, you cannot use the character class ‹[0-F]
› to match any of the 16
hexadecimal digits. Though this character class will actually do that,
it will also match the punctuation symbols that sit between the digits
and the letters in the ASCII table. Instead, place two character ranges
in the character class: [0-9A-F]
.
Another issue that comes into play is case-sensitivity. By
default, regular expressions are case-sensitive. ‹[0-9A-F]
› matches only uppercase
characters, and ‹[0-9a-f]
›
matches only lowercase characters. ‹[0-9A-Fa-f]
› matches both.
Explicitly typing both the uppercase and lowercase ranges in each character class quickly gets tedious. Turning on the case insensitivity option is much easier. See Recipe 3.4 to learn how to do that in your favorite programming language.
All the other recipes in this chapter show more ways of matching different kinds of numbers with a regular expression.
Techniques used in the regular expressions in this recipe are discussed in Chapter 2. Recipe 2.3 explains character classes. Recipe 2.5 explains anchors. Recipe 2.8 explains alternation. Recipe 2.9 explains grouping. Recipe 2.12 explains repetition.