我试图从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代码实现。