【发布时间】:2012-07-19 21:36:36
【问题描述】:
我在一个日志文件中有这样几行:
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);
谢谢!
附:不,我不能为此使用 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 是一个不错的选择吗?如何计算最后一个点?
【问题讨论】:
-
用 boost::regex 代替 linux regex 怎么样?
-
我只需要最快的方法来做到这一点,所以如果你有什么可以帮助我的想法,请发布答案,以便我可以测试并接受它。
-
不是windows的吗?
-
你说最快是指开发时间还是执行速度?