修剪std :: string中的内部空格

时间:2012-02-19 16:21:33

标签: c++ string boost stl trim

我正在寻找一种优雅的方法来转换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中的某些内容?

6 个答案:

答案 0 :(得分:7)

您可以std::uniquestd::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;
}