Need regular expression for checking at least 3 uppercase, 3 lowercase, 3 digits and 3 special character any where in string.
I have tried /^(?=.*[^A-Za-z0-9]
/^(?=(.*[^A-Za-z0-9]){3,})(?=(.*[A-Z]){3,})(?=(.*\d){3,})(?=.*[a-z]){3,}).+/
So you were close.
Both of the other answers fail for a string which doesn't match the "at least 3 lowercase" requirement. Using Bohemian's answer but supporting that case gives the following regex:
^(?=(.*[^A-Za-z0-9]){3})(?=(.*[A-Z]){3})(?=(.*[a-z]){3})(?=(.*\d){3}).+
You were close: you need to bracket the .*
with the character classes in your look aheads:
^(?=(.*[^A-Za-z0-9]){3})(?=(.*[A-Z]){3})(?=(.*\d){3}).+
The reason this works is that the character types may not be adjacent, eg 3 digits might be a1b2c3
, hence the .*
to allow other intervening character types.
Note that you don't need the open-ended quantifiers. eg (.*\d){3}
is sufficient to assert that there are at least 3 digits - ie not ...{3,}
And a final note: those leading/trailing slashes have nothing whatsoever to do with regular expressions - they are an application language artefact. It makes questions and answers clearer and more useful to more people if they are omitted.