gpt4 book ai didi

c++ - 提取两个词之间的域

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:15 25 4
gpt4 key购买 nike

我在日志文件中有这样几行:

11-test.domain1.com 记录 ...

37-user1.users.domain2.org 登录 ...

48-me.server.domain3.net 登录 ...

如何在没有子域的情况下提取每个域?介于“-”和“已记录”之间的内容

我在 c++ (linux) 中有以下代码,但提取得不好。当然,如果您有一些示例,一些返回提取的字符串的函数会很棒。

       regex_t    preg;
regmatch_t mtch[1];
size_t rm, nmatch;
char tempstr[1024] = "";
int start;
rm=regcomp(&preg, "-[^<]+Logged", REG_EXTENDED);
nmatch = 1;
while(regexec(&preg, buffer+start, nmatch, mtch, 0)==0) /* Found a match */
{
strncpy(host, buffer+start+mtch[0].rm_so+3, mtch[0].rm_eo-mtch[0].rm_so-7);
printf("%s\n", tempstr);
start +=mtch[0].rm_eo;
memset(host, '\0', strlen(host));
}
regfree(&preg);

谢谢!

附言不,我不能为此使用 perl,因为这部分位于由其他人编写的更大的 c 程序中。

编辑:

我用这个替换代码:

   const char *p1 = strstr(buffer, "-")+1;
const char *p2 = strstr(p1, " Logged");
size_t len = p2-p1;
char *res = (char*)malloc(sizeof(char)*(len+1));
strncpy(res, p1, len);
res[len] = '\0';

它很好地提取了整个域,包括子域。如何从 abc.def.domain.com 中提取 domain.com 或 domain.net?

strtok 是一个不错的选择吗?我如何计算最后一个点是哪个?

最佳答案

#include <vector>
#include <string>
#include <boost/regex.hpp>

int main()
{
boost::regex re(".+-(?<domain>.+)\\s*Logged");
std::string examples[] =
{
"11-test.domain1.com Logged ...",
"37-user1.users.domain2.org Logged ..."
};
std::vector<std::string> vec(examples, examples + sizeof(examples) / sizeof(*examples));
std::for_each(vec.begin(), vec.end(), [&re](const std::string& s)
{
boost::smatch match;
if (boost::regex_search(s, match, re))
{
std::cout << match["domain"] << std::endl;
}
});
}

http://liveworkspace.org/code/1983494e6e9e884b7e539690ebf98eb5boost::regex 这样的东西。不知道 pcre。

关于c++ - 提取两个词之间的域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569709/

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