Как захватить неупорядоченную последовательность флагов? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть следующие примеры:

FLAGS DCP
FLAGS PRE
FLAGS 4CH
FLAGS SCMS
FLAGS DCP PRE 4CH SCMS
FLAGS PRE 4CH DCP SCMS
FLAGS 4CH DCP PRE SCMS

И я хотел бы захватить его следующим образом:

FLAGS DCP // group 1 = DCP
FLAGS PRE // group 1 = PRE
FLAGS 4CH // group 1 = 4CH
FLAGS SCMS // group 1 = SCMS
FLAGS DCP PRE 4CH SCMS // group 1 = DCP, group 2 = PRE, group 3 = 4CH, group 4 = SCMS
FLAGS PRE 4CH DCP SCMS // group 1 = PRE, group 2 = 4CH, group 3 = DCP, group 4 = SCMS
FLAGS 4CH DCP PRE SCMS // group 1 = 4CH, group 2 = DCP, group 3 = PRE, group 4 = SCMS

Но используя следующее выражение, он захватывает только первый флаг после FLAGS:

^\s*FLAGS\s+((?:(?:DCP|4CH|PRE|SCMS)\s*?)+)

Возможно ли это с помощью регулярных выражений или я должен просто разделить то, что после FLAGS, а затем выполнить синтаксический анализ вручную?

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Согласно моему комментарию. Может быть, просто создайте 4 группы захвата, повторяя вашу последовательность:

^\s*FLAGS\s*(DCP|4CH|PRE|SCMS)?\s*(DCP|4CH|PRE|SCMS)?\s*(DCP|4CH|PRE|SCMS)?\s*(DCP|4CH|PRE|SCMS)?$

Regular expression visualization

Regex Demo

2 голосов
/ 13 марта 2020

Вы можете использовать группу захвата для альтернатив и повторить их внутри группы без захвата, с добавлением 1+ пробелов.

В c# вы можете использовать повторяющуюся группу захвата и получить захваты

^\s*FLAGS(?:\s+(DCP|4CH|PRE|SCMS))+$

Объяснение

  • ^ Начало строки
  • \s*FLAGS Совпадение 0+ вхождений символа пробела и сопоставление FLAGS
  • (?: Группа без захвата
    • \s+(DCP|4CH|PRE|SCMS) Совпадение 1+ пробельных символов и 1 альтернативы
  • )+ Закрыть группу без захвата и повторить 1+ раз
  • $

Regex demo (Нажмите на вкладку Таблица:)

enter image description here

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