La réponse est de ne pas utiliser d'expression régulière. Il s'agit d'ensembles et de comptages.
Les expressions régulières sont une question d'ordre.
Dans votre vie de programmeur, on vous demandera de faire beaucoup de choses qui n'ont pas de sens. Apprenez à creuser un peu plus. Apprenez quand la question n'est pas la bonne.
La question (si elle mentionne les expressions régulières) est erronée.
Pseudocode (je suis passé d'un langage à l'autre ces derniers temps) :
if s.length < 8:
return False
nUpper = nLower = nAlphanum = nSpecial = 0
for c in s:
if isUpper(c):
nUpper++
if isLower(c):
nLower++
if isAlphanumeric(c):
nAlphanum++
if isSpecial(c):
nSpecial++
return (0 < nUpper) and (0 < nAlphanum) and (0 < nSpecial)
Je parie que vous avez lu et compris le code ci-dessus presque instantanément. Je parie que vous avez pris beaucoup plus de temps avec l'expression rationnelle et que vous n'êtes pas certain qu'elle soit correcte. L'extension de la regex est risquée. L'extension de la regex immédiate ci-dessus l'est beaucoup moins.
Il convient également de noter que la question est formulée de manière imprécise. Le jeu de caractères est-il ASCII ou Unicode, ou ? D'après la lecture de la question, je suppose qu'au moins un caractère minuscule est supposé. Je pense donc que la dernière règle supposée devrait être :
return (0 < nUpper) and (0 < nLower) and (0 < nAlphanum) and (0 < nSpecial)
(En changeant de casquette pour se concentrer sur la sécurité, il s'agit d'une vraiment règle ennuyeuse/non utile).
Apprendre à savoir quand la question est fausse est bien plus important que des réponses intelligentes. Une réponse intelligente à une mauvaise question est presque toujours erronée.