Regular Expression - 4 digits in a row, but can't be all zeros

 (?<!\d)(?!0000)\d{4}(?!\d)

or, more kindly/maintainably/sanely:

m{
     (?<! \d   )    # current point cannot follow a digit
     (?!  0000 )    # current point must not precede "0000"
     \d{4}          # match four digits at this point, provided...
     (?!  \d   )    # that they are not then followed by another digit
}x

Since I complained that the some of the answers here weren't regular expressions, I thought I'd best give you a regex answer. This is primitive, there's probably a better way, but it does work:

([1-9][0-9][0-9][0-9]|[0-9][1-9][0-9][0-9]|[0-9][0-9][1-9][0-9]|[0-9][0-9][0-9][1-9])

This checks for something which contains 0-9 in each location, except one which must lie in 1-9, preventing 0000 from matching. You can probably write this simpler using \d instead of [0-9] if your regex parser supports that metacharacter.


Since PCRE supports lookarounds, \d{4}(?<!0000) will find any instance of four consecutive non-zero characters. See it in action here.

If you must make sure the match only occurs in the correct position of the string, you can use ^.{X}\d{4}(?<!0000).{Y}$ instead, where X and Y are the number of preceding and following characters, respectively (12 and 5 in your example.)

Tags:

Regex