in reply to Regular expression for hexadecimal number

I have used regex's in the past to check a minimum and maximum number of digits, usually using base10 integers - check between 0 and 99 for example.
One thing I'd like to be able to do is check that a value is between two limits, without capturing and subsequent processing (for reasons beyond the scope of this discussion). Is there any regex construct that will check that the value is between two other values? For example, check that it is between 3010 and 4123, inclusively?
  • Comment on Re: Regular expression for hexadecimal number

Replies are listed 'Best First'.
Re^2: Regular expression for hexadecimal number
by Fletch (Bishop) on Jul 30, 2007 at 13:56 UTC

    Sure you could; the more important question is should you. You're probably better off implementing a "lower level" check (is this a 4 digit number) at the regex level and then using comparisons in code to check range membership.

    What you want to be worried about is when your requirements shift and now you've got to check if it's between 3021 and 5123 for the comparisons-in-code version it's just a matter of changing two numbers (or redefining FOO_RANGE_MIN and FOO_RANGE_MAX constants since one would never use magic numbers inline, of course :) rather than coming up with a new clever regex to match the new rage.

    Update: Just to show it can be done (but again, probably shouldn't): /^ 3 (?: 0 [1-9] \d | [1-9] \d \d ) | 4 (?: 0 \d \d | 1 (?: [01] \d | 2 [0123] ) ) $/x

      As I pointed out, the reason for doing this is off-topic, let's just say I need a regex that ensures a value is between A and B, where A and B are defined elsewhere (in this case, it's an installer that supports Perl regexes, and I want to check that the port number entered by the user is within an allowable range. Hence the reason I can't post-process the value, I need a regex that does it in one step).

      Ideally, I wanted to be able to pass A and B to the regex, in a way similar to defining {min, max} for the number of characters to match.

      I want to avoid the breaking down of the min and max values into a sequence of ranges, for exactly the reason you point out.

      I still think it is a reasonable question ....