我正在寻找一种优雅的方法来转换std :: string,例如:
std::string text = " a\t very \t ugly \t\t\t\t string ";
要:
std::string text = "a very ugly string";
我已经使用boost::trim(text);
[编辑] 因此,多个空格和制表符被缩减为仅一个空格 [/编辑]
删除外部空格是微不足道的。但有没有一种优雅的方法来删除内部空白,不涉及手动迭代和前一个和下一个字符的比较?我可能错过了boost
中的某些内容?
答案 0 :(得分:7)
您可以std::unique
与std::remove
一起使用::isspace
将多个空格字符压缩为单个空格:
std::remove(std::unique(std::begin(text), std::end(text), [](char c, char c2) {
return ::isspace(c) && ::isspace(c2);
}), std::end(text));
答案 1 :(得分:7)
std::istringstream iss(text);
text = "";
std::string s;
while(iss >> s){
if ( text != "" ) text += " " + s;
else text = s;
}
//use text, extra whitespaces are removed from it
答案 2 :(得分:4)
我所做的大部分内容与@Nawaz已发布的相似 - 从istringstream
读取字符串以获取没有空格的数据,然后在每个字符串之间插入一个空格。但是,我会使用previous answer中的infix_ostream_iterator
来获取(IMO)更清晰/更清晰的代码。
std::istringstream buffer(input);
std::copy(std::istream_iterator<std::string>(buffer),
std::istream_iterator<std::string>(),
infix_ostream_iterator<std::string>(result, " "));
答案 3 :(得分:3)
#include <boost/algorithm/string/trim_all.hpp>
string s;
boost::algorithm::trim_all(s);
答案 4 :(得分:1)
如果您查看https://svn.boost.org/trac/boost/ticket/1808,您会看到(几乎)此确切功能的请求以及建议的实施:
std::string trim_all ( const std::string &str ) {
return boost::algorithm::find_format_all_copy(
boost::trim_copy(str),
boost::algorithm::token_finder (boost::is_space(),boost::algorithm::token_compress_on),
boost::algorithm::const_formatter(" "));
}
答案 5 :(得分:0)
这是使用正则表达式的可能版本。我的GCC 4.6还没有regex_replace
,但Boost.Regex可以作为替代品:
#include <string>
#include <iostream>
// #include <regex>
#include <boost/regex.hpp>
#include <boost/algorithm/string/trim.hpp>
int main() {
using namespace std;
using namespace boost;
string text = " a\t very \t ugly \t\t\t\t string ";
trim(text);
regex pattern{"[[:space:]]+", regex_constants::egrep};
string result = regex_replace(text, pattern, " ");
cout << result << endl;
}