gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:49:18 26 4
gpt4 key购买 nike

我有一个如下所示的配置文件:

[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 组:小节

有人知道如何正确分组吗?谢谢

最佳答案

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

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

解释:

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

Demo

关于c++ - std::regex 用于将由冒号分隔的字符串解析为不同的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55480942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com