获取分割字符串的内容高级技巧

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取分割字符串的内容高级技巧相关的知识,希望对你有一定的参考价值。

获取arp -a 返回

const char * test = "接口: 192.168.1.144 --- 0x5"
"	Internet 地址         物理地址              类型"
"	192.168.1.1           cc-81-da-02-ed-f1     动态"
"	192.168.1.255         ff-ff-ff-ff-ff-ff     静态"
"	224.0.0.22            01-00-5e-00-00-16     静态"
"	224.0.0.251           01-00-5e-00-00-fb     静态"
"	224.0.0.252           01-00-5e-00-00-fc     静态"
"	239.255.255.250       01-00-5e-7f-ff-fa     静态"
"	255.255.255.255       ff-ff-ff-ff-ff-ff     静态";

返回如上面的字符串,如何分割出来呢,获取mac 和 ip 地址的对应,有两种方法一是使用正则表达式,二是使用stl的stringstream 和getline 方法

1 使用stringstream

1 分割行
2 分割字符串
3 插入map表

1.1、getline

使用getline 函数分割行,这个可以参考我的其他文章

1.2、使用streamstream 分割字符串

    string test2 = "  192.168.1.1           cc-81-da-02-ed-f1     动态";
	std::stringstream s(test2);
	string s1, s2, s3;
	s >> s1 >> s2 >> s3;
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;

输出
192.168.1.1
cc-81-da-02-ed-f1
动态

2 使用正则表达式

(\\S+)\\s+(\\S+)\\s+(\\S+)

2.1 使用getline分割

这一部分略过

2.2 使用正则

(\\S+)\\s+(\\S+)\\s+(\\S+)
解释一下:S 为所有非空白字符,相当于

char * pos = "  xxxx xxx xxx "
while((*pos++)!=' ');

后跳到了第一个非空白字符
s 为空白字符,意思为当中有空白字符,相当于stringstream 的字符串移位输出去掉空格,+在正则表达式中意思为一个或者多个

#include <regex>
#include <iostream>
#include <string>
#include <sstream>
std::string test1 = "接口: 192.168.1.144 --- 0x5";
std::string test2 = "  192.168.1.1           cc-81-da-02-ed-f1     动态";


const char * test = "接口: 192.168.1.144 --- 0x5"
"	Internet 地址         物理地址              类型"
"	192.168.1.1           cc-81-da-02-ed-f1     动态"
"	192.168.1.255         ff-ff-ff-ff-ff-ff     静态"
"	224.0.0.22            01-00-5e-00-00-16     静态"
"	224.0.0.251           01-00-5e-00-00-fb     静态"
"	224.0.0.252           01-00-5e-00-00-fc     静态"
"	239.255.255.250       01-00-5e-7f-ff-fa     静态"
"	255.255.255.255       ff-ff-ff-ff-ff-ff     静态";
int main() {
	//std::stringstream s = test2;
	std::string target = "@abc def--";
	std::regex e("(\\\\S+)\\\\s+(\\\\S+)\\\\s+(\\\\S+)");
	std::smatch sm;
	std::regex_search(test2, sm, e);

	for (int i = 0; i < sm.size(); ++i) {
		std::cout << "sm[" << i << "]: " << sm[i] << std::endl;
	}
	std::cout << "sm.prefix: " << sm.suffix() << std::endl;

	return 0;
}

输出:

sm[0]: 192.168.1.1 cc-81-da-02-ed-f1 动态
sm[1]: 192.168.1.1
sm[2]: cc-81-da-02-ed-f1
sm[3]: 动态
sm.prefix:

总结

在分割字符串的过程中,可以使用常用的字符串技巧和正则表达式相结合的方式

以上是关于获取分割字符串的内容高级技巧的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 片段

JavaScript笔试题(js高级代码片段)

常用python日期日志获取内容循环的代码片段

Atom编辑器入门到精通 Atom使用进阶

NMAP高级使用技巧和漏洞扫描发现

bash技巧