Regex Соответствует непустой последовательности символов, где есть четное количество данного символа (включая 0) и любое количество других символов - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь написать регулярное выражение, совпадающее с непустой последовательностью A и B, где четные числа A включают 0.

Например:

AABBABA -> AABBABA
BBBB -> BBBB
A -> nothing

Вот что я мог придумать до сих пор:

(AA+B*|B*AB*A|B*)+

Но в настоящее время это, конечно, будет соответствовать только тому, что в скобках, а не только шаблонам А и В. У меня проблемы с обобщением, чтобы получить четное количество А.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

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

^(?:(?:B*AB*A)+B*|B+)$

Объяснение

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

Regex demo

2 голосов
/ 07 апреля 2020

Если вам нужно использовать регулярные выражения, вы можете использовать что-то вроде этого:

^(?:B*(?:AB*A)*B*)*$

Демо .

Я уверен это не самый эффективный способ, но, похоже, он справляется со своей задачей.

В основном это будет соответствовать двум A символам с нулем или более B символов между ними, и все это повторяется с нуля или более раз. Это гарантирует, что число A будет четным. Тогда у нас есть ноль или более B символов в начале и конце, если строка начинается с или заканчивается B. И затем все повторяется ноль или более раз.

Если вы хотите отклонить пустые строки (и предполагая, что ваше регулярное выражение поддерживает Lookaheads), вы можете добавить простой Lookahead, который ищет один символ в начале выкройки:

^(?=.)(?:B*(?:AB*A)*B*)*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...