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

#regex

#регулярное выражение

Вопрос:

Я пытаюсь написать регулярное выражение, достаточно гибкое, чтобы соответствовать одной, двум или трем группам захвата. К сожалению, я могу сопоставить только две или три группы захвата. На изображении ниже элемент, выделенный желтым, остается непревзойденным. Я бы ожидал, что оно будет соответствовать AB. Мои примеры данных и регулярных выражений находятся здесь: примеры данных и регулярных выражений

введите описание изображения здесь

На словах я пытаюсь сопоставить 1, 2 или 3 группы захвата альфа-символов, которые окружены 1 или 0.

Комментарии:

1.Вот так? [01]([A-Z] )(?=[01]|$)(?:.*?[01]([A-Z] )(?=[01]|$)(?:.*?[01]([A-Z] )(?=[01]|$))?)? regex101.com/r/Ujt75H/1

Ответ №1:

Использование d может соответствовать только 0 или 1, а использование d? означает необязательную цифру.

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

Шаблон соответствует:

 [01]([A-Z] )(?=[01]|$)(?:.*?[01]([A-Z] )(?=[01]|$)(?:.*?[01]([A-Z] )(?=[01]|$))?)?
 
  • [01] Соответствует либо 0, либо 1
  • ([A-Z] )(?=[01]|$) Захватите группу 1, сопоставьте 1 символы от А доЯ и укажите либо 0 или 1 , либо конец строки справа.
  • (?: Не группа захвата
    • .*?[01]([A-Z] )(?=[01]|$) Сопоставьте как можно меньшее количество символов до следующего следующего вхождения для группы 2
    • (?: Не группа захвата
      • .*?[01]([A-Z] )(?=[01]|$) Сопоставьте как можно меньшее количество символов до следующего следующего вхождения для группы 3
    • )? Закройте group и сделайте ее необязательной
  • )? Закройте group и сделайте ее необязательной

Демонстрация регулярных выражений