Показать сообщение отдельно
  #12 (permalink)  
Старый 07.10.2019, 13:39
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

/(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');
Ответить с цитированием