gpt4 book ai didi

html - 尝试使用正则表达式提取一段HTML代码

转载 作者:行者123 更新时间:2023-12-02 10:11:42 25 4
gpt4 key购买 nike

我有一些类似的html代码

<tr class="class1">
<td class="class2">
<a href="some_address"></a>
<div id="id1">
<span class="class3"></span>
</div>
<span>Just a text</span>
</td>
</tr>
我需要提取 <tr class="class1"></tr>标签之间的一段代码。我使用这个正则表达式 https://regex101.com/r/Z0Pmgg/1
。似乎可行。但是,当我尝试在C++ STL中使用此表达式时,它根本不起作用:(
#include <string>
#include <regex>
#include <iostream>

int main()
{
std::string str = "<tr class=\"class1\">\n"
"<td class=\"class2\">\n"
"<a href=\"some_address\"></a>\n"
"<div id=\"id1\">\n"
"<span class=\"class3\"></span>\n"
"</div>\n"
"<span>Just a text</span>\n"
"</td>\n"
"</tr>\n";
std::cmatch result;
std::regex regular("(<tr class=\"class1\">)"
"([\s\S]*?)"
"(<\/tr>)");
if (std::regex_match(str.c_str(), result, regular))
std::cout << "Success\n" << result[2] << std::endl;
return 0;
}
我究竟做错了什么?我也尝试使用regex_search()代替

最佳答案

您需要转义\并考虑最终的\n,或者更好的是,使用regex_iterator而不是regex_match
以下内容适用于GCC 8,Clang 8和MSVC 14:

#include <string>
#include <regex>
#include <iostream>

int main()
{
std::string str = "<tr class=\"class1\">\n"
"<td class=\"class2\">\n"
"<a href=\"some_address\"></a>\n"
"<div id=\"id1\">\n"
"<span class=\"class3\"></span>\n"
"</div>\n"
"<span>Just a text</span>\n"
"</td>\n"
"</tr>\n";
std::regex re("(<tr class=\"class1\">\\s*)"
"([\\s\\S]*?)"
"(\\s*</tr>\\s*)");

for (std::sregex_iterator it{ str.begin(), str.end(), re }, end{}; it != end; it++) {
std::smatch result = *it;
std::cout << "Found:\n\n" << result[2] << "\n";
}
}
输出:
Found:

<td class="class2">
<a href="some_address"></a>
<div id="id1">
<span class="class3"></span>
</div>
<span>Just a text</span>
</td>
注意:一些旧的libstdc++和libc++实现很难理解正则表达式范围 [...]中的字符类。在这种情况下,请尝试用 [\\s\\S]替换 (?:\\s|\\S)(或者更好的是,将libstdc++升级到6-4.9.1或更高版本)。

关于html - 尝试使用正则表达式提取一段HTML代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63291034/

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