Представленные варианты ошибочно срабатывают на
str = `<tag2 c="" d=">`;
и, что самое грустное,
безбожно зависают на длинном незакрытом теге
str = `<tag1 b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""b=""`;
Вот такое вроде бы нигде не косячит:
let str = `<tag1 name1="<value1's>" name2 = 'value>>>>><<<2'>
< tag1 name1="value1"name2 = 'value2<<>>>' >`;
let reg = /<\s*\w+(?:"[^"]*"|'[^']*'|[^>"'])*>/gi;
console.log(str.match(reg));