gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:25:56 26 4
gpt4 key购买 nike

我正在尝试从基本上是 XML 的 std::string 中提取 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 上编译)

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

最佳答案

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

"(.*?)"

然后关于 std:regex请参阅此链接,这是我使用该库的经验。

std regex_search to match only current line

关于c++ - 获取文本中两个非唯一字符串之间的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48703483/

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