我有一个文本,格式为“key:value”。实际文字可能看起来像"Server: nginx"
或"Server:nginx"
,忽略了密钥:
和值之间的空格。
将此分成std::pair<std::string, std::string>
的最快最短的方法是什么?
答案 0 :(得分:5)
这是一个有效的版本。
auto index = str.find(':');
std::pair<std::string,std::string> keyVal;
if (index != std::string::npos) {
// Split around ':' character
keyVal = std::make_pair(
str.substr(0,index),
str.substr(index+1)
);
// Trim any leading ' ' in the value part
// (you may wish to add further conditions, such as '\t')
while (!keyVal.second.empty() && keyVal.second.front() == ' ') {
keyVal.second.erase(0,1);
}
}
答案 1 :(得分:1)
我说
auto index = str.find(":");
std::pair<std::string,std::string> keyVal
if (index != std::string::npos){
keyVal = std::make_pair( str.substr(0,str.size()-index),
str.substr(index+1, std::string::npos));
if (keyVal.second.front() == ' ') {keyVal.second.erase(0,1); }
}
如果分隔符为&#34;:&#34;这将删除空格。而不是&#34;:&#34;
当然,您可以使代码变得更加松散,并删除更多行,并直接使用str.find(":")
而不是&#39; index&#39;。
答案 2 :(得分:1)
我会使用stringstream
并使用:
string str = "Server: nginx with more stuff";
std::string key, val;
std::stringstream ss(str);
std::getline(ss, key, ':');
std::getline(ss, val);
auto p = make_pair(key, val);
if (p.second.front() = ' ') // get rid of leading space if it exist
p.second.erase(0, 1);
答案 3 :(得分:0)
我建议使用正则表达式(如果你的值的模式在运行时不会改变): http://www.cplusplus.com/reference/regex/
但是考虑到性能,你应该对上面显示的所有可能性进行速度测试(手动字符串解析,使用字符串流,正则表达式,......