Мне нужно регулярное выражение, чтобы поймать вставку битов - после 5 последовательных битов одного и того же значения вставляется один противоположный бит.
например
ввод: 00000100000100
вывод регулярного выражения: 000001, 000001
ввод: 00000111110111
вывод регулярного выражения: 000001, 111110
Я сделал это /([01])\1{4}[01]/, но он улавливает 6 последовательных битов и когда последний бит противоположен
Так? ([01])\1{4}(?!\1)
regex101.com/r/l13TWy/1
@Prasanna не уверен, почему я не подумал об этом. Во втором примере отсчет должен начинаться с заполненного бита, как вы можете это сделать?
Во втором примере 4 нуля между единицами. Если бы их было 5 regex101.com/r/C9YHbg/1
@ Четвертая птица, ваше регулярное выражение улавливает только 5 последовательных битов. Пожалуйста, смотрите мое редактирование.
Возможно, с группой захвата внутри просмотра вперед (?=(10000[01]|[01]00001|01111[01]|[01]11110))
regex101.com/r/kaw4au/1
Я смущен желаемым результатом. Не могли бы вы привести пример с заданным входным битовым шаблоном, каков битовый шаблон после первого совпадения и вставки бита, после второго, третьего и т. д.
@Peter Thoeny, я отредактировал вопрос, надеюсь, теперь все ясно
Все еще в замешательстве. При простом заполнении 5-битных битов противоположный бит вставляется в поток после 5 последовательных одинаковых битов, например. 00000100000100
превращается в 0000011000001100
, а в вашем примере 00000100000100
превращается в 000001
?
Мой пример уже с заполненным битом, например. 00000100000100 1 - это заполненные биты...
@Dangur Возможно, так (?=(([01])\2{4}(?!\2)[01]))
regex101.com/r/5UBPEj/1 См. значения группы захвата 1, выделенные зеленым цветом, справа от ссылки regex101.
Вы можете использовать положительный просмотр вперед с 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])));
Почему бы не сделать это просто -
0{5}1|1{5}0
?