Split the regex into smaller parts to check each rule individually.
Here's the code for JavaScript. The same simple logic can be used for Ruby or any other language.
// Check the length
if (str.length >= 8 && validate()) {
}
// Check if all the characters are present in string
function validate(string) {
// Initialize counter to zero
var counter = 0;
// On each test that is passed, increamentincrement the counter
if (/[a-z]/.test(string)) {
// If string contain atleastat least one lowercase alphabet character
counter++;
}
if (/[A-Z]/.test(string)) {
counter++;
}
if (/[0-9]/.test(string)) {
counter++;
}
if (/[!@#$&*]/.test(string)) {
counter++;
}
// Check if atleastat least three rules are satisfied
return counter >= 3;
}