Expressão regular para validação da força da senha

Eu escrevi uma expressão regular que poderia ser usada para validação de força de senha:

^(?:([A-Z])*([a-z])*(\d)*(\W)*){8,12}$

A expressão consiste em quatro grupos:

Zero ou mais caracteres maiúsculosZero ou mais caracteres minúsculosZero ou mais dígitos decimaisZero ou mais caracteres não-palavra (!, £, $,%, etc.)

A maneira que eu quero que funcione é determinar quantos dos grupos foram combinados para determinar a força da senha. Assim, por exemplo, se apenas 1 grupo for correspondido, seria fraco. Se todos os quatro grupos fossem combinados, seria forte.

Eu testei a expressão usandoRubular (um editor de expressões regulares Ruby).

Aqui eu posso ver visualmente, quantos grupos são correspondidos, mas eu quero fazer isso em JavaScript. Eu escrevi um script que retorna o número de grupos correspondentes, mas os resultados não foram os mesmos que eu posso ver no Rubular.

Como posso conseguir isso em JavaScript? e é minha expressão regular até a tarefa?