#javascript #regex
#javascript #регулярное выражение
Вопрос:
Мне нужно регулярное выражение для отслеживания заполнения битов — после 5 последовательных битов одного и того же значения вставляется один противоположный бит.
например
ввод: 00000100000100
вывод регулярных выражений: 000001, 000001
ввод: 00000111110111
вывод регулярных выражений: 000001, 111110
Я сделал это /([01])1{4}[01]/ но он улавливает 6 последовательных битов и когда последний бит противоположен
Комментарии:
1. Почему бы не сделать это просто —
0{5}1|1{5}0
?2.Нравится это?
([01])1{4}(?!1)
regex101.com/r/l13TWy/13. @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])));