std :: regex用于将由冒号分隔的字符串解析为不同的组

时间:2019-04-02 17:59:35

标签: c++ regex

我有一个如下配置文件:

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

每个用:字符分隔的字符串代表节名称或子节名称。我想要一个正则表达式(在C ++ 11中使用std::regex)来解析这些字符串,并将每个节和小节放在不同的组中。

这是我现在拥有的正则表达式:

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

它确实匹配,但是没有分成不同的组,而是匹配第一部分,然后将子部分添加为后缀。

例如,在源字符串[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 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式将所需数据分为三组,而仅将第一个数据作为必需数据,而将其他数据组显示为嵌套和可选。

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

说明:

  • \[-开始使用文字[捕获模式
  • (?:-启动非分组模式
  • ([a-zA-Z]+)-捕获第一个字母文本并将其放置在group1中
  • (?::(?:([a-zA-Z]+)(?::([a-zA-Z]+))?))?-这是一个双嵌套模式,用冒号分隔,并将两个字母文本放在group2和group3中,这两个都是可选的,因为非捕获组后跟? < / li>
  • )\]-关闭非分组模式,后跟文字]

Demo