Регулярное выражение для сопоставления строки с четным числом единиц, начинающейся и заканчивающейся 0 - PullRequest
0 голосов
/ 12 января 2019

Я пытался создать регулярное выражение для утверждения выше. Лучшее решение, которое я нашел до сих пор, это 0 (0 * (10 * 10 *) * 0) ?. Это позволяет сопоставить один ноль и несколько нулей, что я считаю правильным, но мне просто интересно, есть ли более простое решение.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Попробуйте следующее регулярное выражение:

^0(?=(?:(?:[^1]*1){2})+[^1]*0$).*

подробности:

  • ^0 - начало строки и (начальное) 0.
  • (?= - Позитивный прогноз на:
  • (?: - группа без захвата (внешняя).
    • (?: - Еще одна (внутренняя) группа без захвата, содержащая:
    • [^1]*1 - (возможно, пустая) последовательность символов, отличная от 1 и 1.
    • ){2} - происходит 2 раза (пара).
  • )+ - Эта группа (пары единиц) может встречаться несколько раз (четное количество единиц).
  • [^1]* - (возможно, пустая) последовательность символов, отличная от 1
  • 0$ - 0 и конец строки (заканчивающийся 0).
  • ) - Конец позитивного взгляда.
  • .* - сопоставить всю строку.

Если вы согласны с тем, что 1 символов отсутствуют, измените + после внешнего захвата группа до *.

Рабочий пример см. https://regex101.com/r/FvP0Ud/1

Вы можете поэкспериментировать с этим регулярным выражением, добавив / удалив 1 символов в начале / end / в середине строки и проследите, соответствует ли строка или нет.

Еще одна деталь: приведенное выше регулярное выражение позволяет также цифры, отличные от 0 и 1 и вообще все персонажи. Если вы хотите ограничить разрешенные символы просто 0 и 1, измените [^1] на 0 (в обоих местах).

0 голосов
/ 12 января 2019

Вы можете использовать чуть более эффективный шаблон, как

^0+((0*10*1)*0+)?$

С группами без захвата:

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

А если вам нужно разрешить пустую строку:

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

См. Демонстрационную версию regex . Поскольку нули предшествуют единицам в повторяющейся группе, то при сопоставлении последних нулей чуть меньше отступает.

Детали

  • ^ - начало строки
  • 0+ - один или несколько 0 с
  • ((0*10*1)*0+)? - необязательная последовательность
    • (0*10*1)* - 0+ повторений 0+ нулей, 1, 0+ нулей и затем снова 1
    • 0+ - один или несколько 0 с
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...