获取文本中两个非唯一字符串之间的子字符串

时间:2018-02-09 10:13:29

标签: c++ regex

我试图从std :: string中提取一个基本上是XML的xml属性。我没有使用XML解析器或std之外的任何东西,但请注意,我特意只查找这个特定的xml属性,而不是真正解析xml。仅为此特定提取过程集成库/解析器没有意义。

示例字符串:

<Params>
<Element Name="elem(1)"/>
<Some Value="10"/>
<Element Name="elem(2)" /> 
<Attr Value="40" />
</Params>

我需要提取的字符串具体为: elem(1)和elem(2)

所以要匹配我使用开始和结束变量

start string is  "<Element Name=\"" and string end "\"" 

我把这段代码放在一起,显然是通过很多SO文章来搜索的:

int main()
{
    const std::string s = "<Element Name=\"elem(1)\"/> <Some Value=\"10\" Unit=\"m\"/> <Element Name=\"elem(2)\"/> <Attr Value=\"40\" />";
    std::string start = "<Element Name=\"";
    std::string end = "\"";

    std::regex words_regex(start + "(.*)" + end);

    auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
    auto words_end = std::sregex_iterator();

    std::cout << "Found " 
          << std::distance(words_begin, words_end) 
          << " words:\n";

    for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
       std::smatch match = *i;                                                 
       std::string match_str = match.str(); 
       std::cout << match_str << '\n';
    }
}

问题是它返回以最后一个双引号结尾的整个字符串。我将处理收集多个子字符串的部分。但首先我需要确保正则表达式至少返回第一个子字符串。

我已经看到很多人提到了正则表达式的正面预测并试图理解它。但是我还没有能够使用std :: regex。完全支持吗? (在Visual Studio 2015和GCC 4.8.2上编译)

其他解决方案也是受欢迎的,只要它们不涉及第三方库并且可以使用std C ++ 11代码实现。

1 个答案:

答案 0 :(得分:2)

首先让你的模式非贪婪.*.*?,以便尽可能短。它将是这样的:

"(.*?)"

然后在中关于std:regex库,请参阅此链接,这是我对此库的体验。

std regex_search to match only current line