regular expressions: match x times OR y times
^(\d{3}|\d{6})$
You have to have some sort of terminator otherwise \d{3}
will match 1234. That's why I put ^ and $ above. One alternative is to use lookarounds:
(?<!\d)(\d{3}|\d{6})(?!\d)
to make sure it's not preceded by or followed by a digit (in this case). More in Lookahead and Lookbehind Zero-Width Assertions.
How about:
(\d\d\d){1,2}
although you'll also need guards at either end which depend on your RE engine, something like:
[^\d](\d\d\d){1,2}[^\d]
or:
^(\d\d\d){1,2}$
For this case we can get away with this crafty method:
Clean Implementation
/(\d{3}){1,2}/
/(?:\d{3}){1,2}/
How?!
This works because we're looking for multiples of three that are consecutive in this case.
Note: There's no reason to capture the group for this case so I add the ?:
non capture group flag to the capture group.
This is similar to paxdiablo
implementation, but slightly cleaner.
Matching Hex
I was doing something similar for matching on basic hex colors since they could be 3 or 6 in length. This allowed me to keep my hex color checker's matching DRY'd up ie:
/^0x(?:[\da-f]{3}){1,2}$/i