Регулярные выражения, получить массив единиц, окруженных нулями

Есть строка: '101000001101' Нужно получить массив, состоящий из единиц, окруженных нулями, т.е. ['10','010','0110','01'] Делаю так:

var rez = s.match(/^1+0|01+0|01+$/g);

В результате выводится массив из двух элементов['10','0110'] Как поправить регулярку, чтобы получить нужный результат? https://regex101.com/r/FWAPpY/1 Спасибо!


Ответы (2 шт):

Автор решения: becouse

Надо понимать, что делают регулярные выражения: проверяет соответствие шаблону. У вас желаемые результаты перекрываются. Что это значит?

Рассмотрим строку 0000 и Шаблон =/00/. Некое ожидаемое поведение состоит в том, что совпадений 3 штуки ['00','00','00'], реальность в том, что шаблон проверяется по симовольно с движением вперед и результат будет ['00','00'].

В вашем случае у результатов '10' и '010' общая граница, поэтому шаблону соответствует только первый. Далее аналогично.

Что делать?

Использовать логические операции в шаблоне.

В регулярных выражениях есть синтаксические выражение, позволяющие в шаблонах использовать простые логические конструкции:

(?= шаблон) - после этой точки есть фрагмент текста, который соответствует указанному регулярному выражению

Пример:

const regex = /(?=(^1+0|01+0|01+$))/gm;
const str = `101000001101`;
let m;

while ((m = regex.exec(str)) !== null) {
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }

    console.log(`Found match: ${m[1]}`);

}

Результат

Found match: 10
Found match: 010
Found match: 0110
Found match: 01
→ Ссылка
Автор решения: рони

как вариант ...

let s = '101000001101';
console.log([...s.matchAll(/(?=(^1+0|01+0|01+$))/gm)].map(a => a[1]));

→ Ссылка