我有一个如下配置文件:
[sectionName]
[sectionName:subSection]
[sectoinname:sub:subsection]
[] # This should not be matched
每个用:
字符分隔的字符串代表节名称或子节名称。我想要一个正则表达式(在C ++ 11中使用std::regex
)来解析这些字符串,并将每个节和小节放在不同的组中。
这是我现在拥有的正则表达式:
([^:\[]+?)(?=:|\])
它确实匹配,但是没有分成不同的组,而是匹配第一部分,然后将子部分添加为后缀。
例如,在源字符串[sectionName:subSection]
上:
这是我用于匹配的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]
sectoinname
sub
subsection
有人有想法将其正确分组吗?谢谢
答案 0 :(得分:1)
您可以使用此正则表达式将所需数据分为三组,而仅将第一个数据作为必需数据,而将其他数据组显示为嵌套和可选。
\[(?:([a-zA-Z]+)(?::(?:([a-zA-Z]+)(?::([a-zA-Z]+))?))?)\]
说明:
\[
-开始使用文字[
捕获模式(?:
-启动非分组模式([a-zA-Z]+)
-捕获第一个字母文本并将其放置在group1中(?::(?:([a-zA-Z]+)(?::([a-zA-Z]+))?))?
-这是一个双嵌套模式,用冒号分隔,并将两个字母文本放在group2和group3中,这两个都是可选的,因为非捕获组后跟?
< / li>
)\]
-关闭非分组模式,后跟文字]