/(text1|text2|text3)/g - совсем не то же самое, что регулярка в стартовом посте. Здесь куски находятся по отдельности, а там - именно как составная конструкция.
в стартовом посте text2 не вылавливается из-за нежадности. Первая
.*? забирает пустую подстроку, потом не находится text2, далее
.*? растягивается до text3, и всё. Регулярка не замотивирована найти text2 в середине.
самый простой (но не факт, что универсальный) способ допилки стартового регекса:
var rx = /(text1)(?:.*?(text2))?.*?(text3)/;
function exec(str) {
var m = rx.exec(str);
if (!m) { return alert([str, '', 'not matched'].join('\n')); }
alert([str, '', m[1], m[2], m[3]].join('\n'));
}
exec('aaaa text1 aaaaa text2 aaaa text3 aaaa');
exec('aaaa text1 aaaaa aaaa text3 aaaa');
exec('aaaa text1 aaaaa text2 aaaa aaaa');