提取两个单词之间的域
extract domain between two words
我在日志文件中有一些行,如下所示:
11-test.domain1.com已登录。。。
37-user1.users.main2.org已登录。。。
48-me.server.domain3.net已登录。。。
如何在没有子域的情况下提取每个域?介于"-"answers"已记录"之间。
我在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("%sn", tempstr);
start +=mtch[0].rm_eo;
memset(host, ' ', 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] = ' ';
这很好地提取了包括子域在内的整个域。如何从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/1983494e6e9e884b7e539690ebf98eb5类似于boost::regex。不知道pcre。
是否为标准格式?看起来是这样的,有分裂函数吗?
编辑:这里有一些逻辑。遍历要解析的每个域查找函数以定位第一个字符串"-"的索引接下来查找第二个字符串的索引减去第一个字符串"Logged"现在您拥有完整的域。
一旦你有了完整的域"拆分"域到你选择的对象(我使用了一个数组)现在您已经将数组分解,找到要重新组装(连接)的值的索引,以仅捕获域。
注释用C#编写
定义第一个值和第二个值的主要方法
`static void Main(string[]args){string firstValue="-";string secondValue="已记录";列表域=新列表{"11-test.domain1.com已登录"、"37-user1.users.domain2.org已登录"answers"48-me.server.domain3.net已登录"};foreach(域中的字符串dns){Debug.WriteLine(Utility.GetStringBetweenFirstAndSecond(dns,firstValue,secondValue));}}`
解析字符串的方法:
`public string GetStringBetweenFirstAndSecond(字符串str,字符串firstStringToFind,字符串secondStringToFind){string domain=字符串。空的if(string.IsNullOrEmpty(str)){//抛出异常,优雅地返回,无论你决定什么}其他的{//这一切都可以在一行中完成,但我把它分解开来,以便更好地理解。//返回第一次出现。//int start=str.IndexOf(firstStringToFind)+1;//int end=str.IndexOf(secondStringToFind);//domain=str.Substring(开始,结束-开始);//即绝对不太清晰,但不会产生不必要的物体domain=str.Substring((str.IndexOf(firstStringToFind)+1),str.Index Of(secondStringToFind)-(str.IIndexOf;string[]dArray=域。拆分('.');如果(dArray.Length>0){如果(dArray.Length>2){domain=字符串。格式("{0}.{1}",dArray[dArray.Length-2],dArray[dArray.Length-1]);}}}返回域;}`
相关文章:
- 在单词之间添加空格
- 使用正则表达式c++从单词和分隔符之间的字符串中提取所有子字符串
- 单词之间的莫尔斯电码空格问题
- 如何读取特定单词之间的文本文件?
- 如何在两个单词之间添加空格
- 在C 中的单词之间删除除一个空间以外的所有空间
- 找出两个给定单词和字典之间最短的单词阶梯
- 从两个单词之间获取字符串
- C++均匀地分配单词之间的空格
- C++ 计算文件中两个单词之间的单词
- 使用线程在以元音或辅音开头的单词之间交替
- 删除字符串 c++ 中 < 和 > 符号之间的单词
- C++如何在两个单词之间获取字符串/字符
- 提取两个单词之间的域
- 增加单词之间的空格,按列排列单词
- C++中单词之间的常量制表位
- c ++ 如何提取单词之间的空格(如果有)
- 在文件中搜索字符串(逐行),忽略单词之间空白的大小
- 移动字符串中的单词,单词之间使用空格作为分隔符
- Wordwap函数修复保留单词之间的空白