Istnieją dwa podejścia. Jednym z nich jest utworzenie pojedynczego wyrażenia, które obsługuje wszystkie możliwe alternatywy:
^[a-zA-Z][0-9][a-zA-Z0-9-,._;:]{6,}$
|
^[a-zA-Z][a-zA-Z0-9-,._;:][0-9][a-zA-Z0-9-,._;:]{5,}$
|
^[a-zA-Z][a-zA-Z0-9-,._;:]{2}[0-9][a-zA-Z0-9-,._;:]{4,}$
itp. To kombinatoryczny koszmar, ale zadziała.
O wiele prostszym podejściem jest dwukrotna walidacja tego samego ciągu za pomocą dwóch wyrażeń:
^[a-zA-Z0-9-,._;:]{8,}$ # check length and permitted characters
i
[a-zA-Z].*[0-9]|[0-9].*[a-zA-Z] # check required characters
EDYCJA:@briandfoy poprawnie wskazuje, że bardziej wydajne będzie wyszukiwanie każdego wymaganego znaku osobno:
[a-zA-Z] # check for required alpha
i
[0-9] # check for required digit