^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?!.*[!@#$%^&*]).{6,12}$
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?!.*[!@#$%^&*]).{6,12}$
Olá Eugenio, tudo bem ? Tentei explicar da melhor maneira possível, espero ter ajudado de alguma forma. Voce pode conferir o link abaixo com a documentação do regex, eles tem alguns exemplos que ajudam a compreender melhor. Ainda estou aprendendo também então a explicação pode conter alguns erros, caso tenha, favor mandar aqui a correção =D.
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?!.*[!@#$%^&*]).{6,12}$
^ - início do alvo
(?=.*[a-z])
() Declaramos um grupo
?= associa os caracteres de acordo com o grupo declarado após o mesmo
.* o "ponto" que significa qualquer char + "asterisco" que associa um ou mais caracteres
[a-z] - letras de a até z
A diferença para o próximo grupo são só os tipos das letras, que no primeiro é minúscula e no segundo maiúscula.
(?=.*[0-9])
() Declaramos um grupo
?= associa os caracteres de acordo com o grupo declarado
.* o "ponto" que significa qualquer char + "asterisco" que associa um ou mais caracteres
[0-9] - intervalo de números
(?!.[!@#$%^&])
() Declaramos um grupo
?! associa os caracteres de acordo com o grupo declarado que não podem estar presentes
.* o "ponto" que significa qualquer char + "asterisco" que associa um ou mais caracteres
[!@#$%&*] conjunto de símbolos que não podem estar presentes
.{6,12}
{n,m} - no mínimo n vezes, no máximo m vezes.
$ - fim do alvo