RegExp, чтобы поймать битовую начинку

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

например

ввод: 00000100000100

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

ввод: 00000111110111

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

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

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

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

Prasanna 20.12.2020 16:11

Так? ([01])\1{4}(?!\1)regex101.com/r/l13TWy/1

The fourth bird 20.12.2020 16:11

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

Dangur 20.12.2020 16:21

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

The fourth bird 20.12.2020 16:27

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

Dangur 20.12.2020 16:40

Возможно, с группой захвата внутри просмотра вперед (?=(10000[01]|[01]00001|01111[01]|[01]11110))regex101.com/r/kaw4au/1

The fourth bird 20.12.2020 18:31

Я смущен желаемым результатом. Не могли бы вы привести пример с заданным входным битовым шаблоном, каков битовый шаблон после первого совпадения и вставки бита, после второго, третьего и т. д.

Peter Thoeny 20.12.2020 23:49

@Peter Thoeny, я отредактировал вопрос, надеюсь, теперь все ясно

Dangur 21.12.2020 09:14

Все еще в замешательстве. При простом заполнении 5-битных битов противоположный бит вставляется в поток после 5 последовательных одинаковых битов, например. 00000100000100 превращается в 0000011000001100, а в вашем примере 00000100000100 превращается в 000001?

Peter Thoeny 21.12.2020 09:56

Мой пример уже с заполненным битом, например. 00000100000100 1 - это заполненные биты...

Dangur 21.12.2020 12:51

@Dangur Возможно, так (?=(([01])\2{4}(?!\2)[01]))regex101.com/r/5UBPEj/1 См. значения группы захвата 1, выделенные зеленым цветом, справа от ссылки regex101.

The fourth bird 21.12.2020 15:00
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
0
11
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.info(Array.from(s.matchAll(regex), m => m[1])));

Другие вопросы по теме