Регулярные выражения, получить массив единиц, окруженных нулями
Есть строка: '101000001101' Нужно получить массив, состоящий из единиц, окруженных нулями, т.е. ['10','010','0110','01'] Делаю так:
var rez = s.match(/^1+0|01+0|01+$/g);
В результате выводится массив из двух элементов['10','0110'] Как поправить регулярку, чтобы получить нужный результат? https://regex101.com/r/FWAPpY/1 Спасибо!
Ответы (2 шт):
Надо понимать, что делают регулярные выражения: проверяет соответствие шаблону. У вас желаемые результаты перекрываются. Что это значит?
Рассмотрим строку 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]));