std :: regex для разбора строки, разделенной двоеточиями, в разные группы - PullRequest
1 голос
/ 02 апреля 2019

У меня есть файл конфигурации, который выглядит следующим образом:

[sectionName]
[sectionName:subSection]
[sectoinname:sub:subsection]
[]  # This should not be matched

Где каждая строка, разделенная символом :, представляет собой либо имя раздела, либо имя подраздела.Я хочу, чтобы регулярное выражение (используя std::regex в C ++ 11) анализировало эти строки и помещало каждый раздел и подраздел в отдельную группу.

Это регулярное выражение, которое у меня сейчас есть:

([^:\[]+?)(?=:|\])

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

Например, в исходной строке [sectionName:subSection]:

enter image description here

Вот мой код C ++ для сопоставления:

const std::smatch ConfigParser::IsSectionHeader( const std::string & aSource )
{
    std::smatch section_match;

    static const std::regex sectionReg( R"(([^:\[]+?)(?=:|\]))");
    std::regex_search( aSource, section_match, sectionReg );

    return section_match;
}

Это результат, который я ищу:

Для теста [sectoinname:sub:subsection]

  • Полный матч: [sectoinname:sub:subsection]
  • Группа 1:sectoinname
  • Группа 2: sub
  • Группа 3: subsection

У кого-нибудь есть идеи сгруппировать это правильно?Спасибо

1 Ответ

1 голос
/ 02 апреля 2019

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

\[(?:([a-zA-Z]+)(?::(?:([a-zA-Z]+)(?::([a-zA-Z]+))?))?)\]

Объяснение:

  • \[ - начинается захват шаблона с литералом [
  • (?: - начинается шаблон без группировки
  • ([a-zA-Z]+) - захватпервый алфавитный текст и помещает их в group1
  • (?::(?:([a-zA-Z]+)(?::([a-zA-Z]+))?))? - эта часть является дважды вложенным шаблоном, разделенным двоеточием, и помещает два алфавитных текста в group2 и group3, оба из которых являются необязательными в качестве не захватывающихза группой следует ?
  • )\] - закрывает шаблон без группировки, за которым следует буквальный ]

Demo

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