Регулярное выражение для отслеживания заполнения битов

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Мне нужно регулярное выражение для отслеживания заполнения битов — после 5 последовательных битов одного и того же значения вставляется один противоположный бит.

например

ввод: 00000100000100

вывод регулярных выражений: 000001, 000001

ввод: 00000111110111

вывод регулярных выражений: 000001, 111110

Я сделал это /([01])1{4}[01]/ но он улавливает 6 последовательных битов и когда последний бит противоположен

https://regex101.com/r/QdoVbK/2

Комментарии:

1. Почему бы не сделать это просто — 0{5}1|1{5}0 ?

2.Нравится это? ([01])1{4}(?!1) regex101.com/r/l13TWy/1

3. @Prasanna не уверен, почему я об этом не подумал. Во втором примере отсчет должен начинаться с заполненного бита, как вы можете это сделать?

4. Во втором примере 4 нуля между 1. Если бы было 5 regex101.com/r/C9YHbg/1

5. @Четвертая птица, ваше регулярное выражение улавливает только 5 последовательных битов. Пожалуйста, посмотрите мою правку.

Ответ №1:

Вы могли бы использовать позитивный прогноз с 2 группами захвата. Повторите 5 одинаковых значений в группе 2, за которыми следует шестое, если оно не совпадает со значением в группе 2.

Все значение находится в группе захвата 1.

 (?=(([01])2{4}(?!2)[01]))
 

Объяснение

  • (?= Позитивный прогноз
    • ( Группа захвата 1
      • ([01])2{4} Группа захвата 2, сопоставьте либо 0 или 1 и сопоставьте одно и то же значение 4 раза
      • (?!2) Отрицательный прогноз, не утверждайте значение группы 2 непосредственно справа
      • [01] Сопоставьте либо 0 или 1
    • ) Закрыть группу 1
  • ) Закрыть предварительный просмотр

Демонстрация регулярных выражений

 const regex = /(?=(([01])2{4}(?!2)[01]))/g;
[
  "00000100000100",
  "00000111110111"
].forEach(s => console.log(Array.from(s.matchAll(regex), m => m[1])));