const regex = new RegExp('<span>
[^<>]*+
(?>
[^<>]+
| (?!<span>|</span>).
| (?R)
)*
</span>', 'sig')
const str = `Начало.
<span><b>правильно</b></span>
ошибка
<span>правильно <i><span>правильно</span></i> правильно</span>.
ошибка
<i><span>правильно <span><i>правильно</i></span> правильно</span></span>.
ошибка
<span>правильно</span>
ошибка
<span></span>
ошибка
<span><span></span></span>
ошибка
<span>ошибка<span>ошибка<span>правильно</span>
ошибка
Конец.`;
const subst = ``;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions