我在日志文件中有一些这样的行:
11-test.domain1.com 记录...
37-user1.users.domain2.org 记录...
48-me.server.domain3.net 记录...
如何在没有子域的情况下提取每个域?介于 "-" 和 "Logged" 之间的东西。
我在 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);
谢谢!
PS 不,我不能为此使用 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 是一个不错的选择,我如何计算最后一个点?