Regex для матчей 0 и 1, где последовательные 1 должны быть нечетными? - PullRequest
3 голосов
/ 21 октября 2019

Я хотел бы написать регулярное выражение, которое может соответствовать двоичной строке, где последовательные 1 должны иметь нечетную длину.

Примеры: 1001110111 принимается и 10110111 не принимается.

(1(11)*|0*)*

Лучшее, что я придумал, - это вышеизложенное, что не правильно. Это регулярное выражение будет соответствовать последовательным даже 1 с тоже. Любые другие идеи?

TIA

Ответы [ 4 ]

2 голосов
/ 21 октября 2019

Если ваш вариант регулярного выражения поддерживает притяжательные квантификаторы для предотвращения обратного отслеживания.

^0*(?:(?:11)*+10*)*$

См. Эту демонстрацию на regex101

Имейте в виду, чтоэтот также будет соответствовать пустой строке. Если строка всегда должна начинаться с 1 и содержать один или несколько символов, попробуйте ^(?:(?:11)*+10*)+$

2 голосов
/ 21 октября 2019

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

^(?:(?:0*1(?:11)*(?:0+|$))+|0+)$
  • ^ Начало строки
  • (?: Группа без захвата
    • (?: Группа без захвата
      • 0*1(?:11)* Соответствие 0+ нулям, 1 и повторение 0+раз 11
      • (?:0+|$) Соответствие 1+ нулям или подтверждение конца строки
    • )+ Закройте группу без захвата и повторите 1+ раз, чтобы не совпадать с пустымстроки
    • | или
    • 0+ Соответствие только нулям
  • ) Закрыть группу без захвата
  • $ Конец строки

Regex demo

2 голосов
/ 21 октября 2019

Вы можете использовать это регулярное выражение для этого с отрицательным прогнозом:

^(?!(?:[01]*0)?(?:1{2})+(?:0|$))[01]+$

Демонстрация RegEx

Подробности RegEx:

  • (?!(?:[01]*0)?(?:1{2})+(?:0|$)): Выражение для сбоя при совпадении, когда в выражении есть четное число 1 s в любом месте. (?:1{2})+ соответствует паре 1 s
  • (?:0|$) гарантирует, что за парой 1 s не последует 1
  • (?:[01]*0)?: разрешено только присутствие0 или начинаются непосредственно перед 1 s

  • [01]+: сопоставить строку с 0 или 1 с одной или несколькими длинами

1 голос
/ 21 октября 2019

Это не должно нуждаться в осложнениях, связанных с обходными решениями. Основная проблема с вашим попытанным решением - 0*, который может соответствовать нулю 0 с до следующей группы 1 с.

0*(1(11)*0+)*(1(11)*)?

Это обрабатывает ведущие 0 с. Если вас это не беспокоит, вы можете удалить 0*.

"Мясо" - это внутреннее выражение с 0+. Нечетные группы 1 s, разделенные одним или несколькими 0 s.

Поскольку эти группы заканчиваются 0, нам понадобится дополнительная нечетная группа 1 s в конце на случай, если строкаоканчивается на 1.

Обратите внимание, что, поскольку все приведенные выше значения являются необязательными, приведенное выше решение также будет соответствовать пустой строкеЕсли вам нужен хотя бы один 1, он немного сложнее:

0*1(11)*(0+1(11)*)*0*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...