John
John

Reputation: 203

US Zip+4 Validation

I have a req to provide US Zip+4 with the +4 being optional and the +4 can't be 0000. I'm doing this in .NET therefore I'm using RegularExpressionValidator with RegEx set. In my first validator I'm checking if the Zip code is xxxxx-xxxx or xxxxx format that is 5+4 or 5. In my 2nd validator I check if the last 4 are not set to 0000. This means 1234-0000 is invalid. These are my Regex and I want to be sure they are valid. Seems they test okay, however when cross checking them with the regex101 app online I'm getting different behavior than .NET.

xxxxx-xxxx or xxxxx = ^[0-9]{5}(?:-[0-9]{4})?$


xxxxx-0000 = \d{5}(?!-0000).*     

This last one I quite don't understand how it works, but it seems to work. Someone help explain me the ?! and .* they both seem to need to be necessary for this to function. My understanding is the .* means all char and the ?! means negative lookahead????

Upvotes: 1

Views: 242

Answers (1)

Tim Biegeleisen
Tim Biegeleisen

Reputation: 521674

Actually, the regex pattern I would suggest here is actually a combination of the two you provided above:

^[0-9]{5}(?!-0000$)(?:-[0-9]{4})?$

Demo

Here is an explanation of the pattern:

^                   from the start of the ZIP code
    [0-9]{5}        match a 5 digit ZIP code
    (?!-0000$)      then assert that the PO box is NOT -0000
    (?:-[0-9]{4})?  match an optional -xxxx PO box (which can't be 0000)
$                   end of the ZIP code

Of note, the (?!-0000$) term is called a negative lookahead, because it looks ahead in the input and asserts that what follows is not -0000. But, using a lookahead does not advance the pattern, so after completing the negative assertion, the pattern continues trying to match an optional -xxxx PO box following.

Upvotes: 2

Related Questions