Regular Expressions Match an IP Address



To match IPv4 address format, you need to check for numbers [0-9]{1,3} three times {3} separated by periods \. and ending with another number.


This regular expression is too simple - if you want to it to be accurate, you need to check that the numbers are between 0 and 255, with the regex above accepting 444 in any position. You want to check for 250-255 with 25[0-5], or any other 200 value 2[0-4][0-9], or any 100 value or less with [01]?[0-9][0-9]. You want to check that it is followed by a period \. three times {3} and then once without a period.



IPv6 addresses take the form of 8 16-bit hex words delimited with the colon (:) character. In this case, we check for 7 words followed by colons, followed by one that is not. If a word has leading zeroes, they may be truncated, meaning each word may contain between 1 and 4 hex digits.


This, however, is insufficient. As IPv6 addresses can become quite "wordy", the standard specifies that zero-only words may be replaced by ::. This may only be done once in an address (for anywhere between 1 and 7 consecutive words), as it would otherwise be indeterminate. This produces a number of (rather nasty) variations:


Now, putting it all together (using alternation) yields:


Be sure to write it out in multiline mode and with a pile of comments so whoever is inevitably tasked with figuring out what this means doesn't come after you with a blunt object.