Con la tua espressione regolare non prende i codici come ad esempio a1a...

Credo di essere riuscito a corrgeere la mia:
codice:
^(?=[a-zA-Z\%][a-zA-Z0-9\%]{2,5}$)(?=.*[0-9].*)
Spiegazoine
^ Inizio dell'espressione regolare
(?=...) (Forse la parte che hai capito di meno)
In questo caso il punto interrogativo non vuol dire "zero o una volta".
Vuole dire che quello che c'è prima deve essere seguito da ciò che c'è dopo l'uguale:
Esempio
codice:
a(?=[0-9])
Trova tutte le a seguite da un numero.
Quindi l'espressione regolare trova tutti gli inizi di stringa ^ seguiti dal contenuto della prima volta che trovi questo segno e dal contenuto della seconda

Simile a questo è (?!...) che vuole dire "tutto ciò che c'è prima che non sia seguito da ciò che c'è dopo il punto esclamativo
[a-zA-Z\%] I caratteri maiuscoli e minuscoli dalla a alla z e il simbolo %
[a-zA-Z0-9\%] I caratteri maiuscoli e minuscoli dalla a alla z, le cifre da 1 a 9 e il simbolo %
{2,5} La "cosa" di prima deve essere ripetuta tra le due e le cinque volte (non {3,6} perché la prima volta era già stata cercata, senza numeri)
$ Fine della stringa
.* Qualsiasi cosa
[0-9] Una cifra da 0 a 9

Quindi l'espressione regolare cerca una stringa il cui primo carattere sia una lettera o il simbolo % e che abbia altri due,tre,quattro o cinque caratteri che siano una lettera, un numero o il % (prima parte). La stringa deve anche contenere un numero (seconda parte)