Ci sono due approcci. Uno consiste nel comporre un'unica espressione che gestisca tutte le possibili alternative:
^[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,}$
ecc. Questo è un incubo combinatorio, ma funzionerebbe.
Un approccio molto più semplice consiste nel convalidare la stessa stringa due volte utilizzando due espressioni:
^[a-zA-Z0-9-,._;:]{8,}$ # check length and permitted characters
e
[a-zA-Z].*[0-9]|[0-9].*[a-zA-Z] # check required characters
EDIT:@briandfoy sottolinea correttamente che sarà più efficiente cercare separatamente ogni carattere richiesto:
[a-zA-Z] # check for required alpha
e
[0-9] # check for required digit