如何用任意数量的空格替换空格?

时间:2014-08-11 23:14:44

标签: c++ regex

我正在尝试使用boost::regex构建正则表达式(我的GCC版本并没有特别好地处理std::regex。)

我想用\s*替换任何出现的空格,以便它匹配任意数量的空格(如果空格的数量不同,我不在乎)。

以下是一个例子:

std::string s = "this is a test string";
s = boost::regex_replace(s, boost::regex("\\s+"), "\\s*");

std::cout << s;

这会产生:

  

thiss * ISS *为*试验*串;

想要的this\s*is\s*a\s*test\s*string。为什么这不起作用?

我尝试用\\\\s*替换,但这只会产生this\\s*is\\s*a\\s*test\\s*string,而不是我之后的事情!

2 个答案:

答案 0 :(得分:2)

在这种情况下,使用正则表达式似乎无法获得很多收益。有一个(可能是次要的)附带条件,没有它们就很容易做到这一点(尽管将结果与字符串匹配将非常需要正则表达式。)

std::string input = "this is a test string";

std::istringstream buffer(input);

std::ostringstream result;

std::copy(std::istream_iterator<std::string>(buffer),
          std::istream_iterator<std::string>(),
          infix_ostream_iterator<std::string>(result, "\\s*"));

std::cout << result.str();

结果:this\s*is\s*a\s*test\s*string

这使用another post中的infix_ostream_iterator

附带条件:这并没有(当前)尝试在结果模式的开头和/或结尾处理空白。在大多数情况下,这些都不是必需的,但如果你想添加它们,那么这样做是非常简单的。

答案 1 :(得分:0)

这不是一个非常令人满意的解决方案,但根据评论,我认为这可能是我的boost版本(1.53)的问题。为了解决这个问题,我只需要修改所有空格:

stringToMatch = boost::regex_replace(stringToMatch, boost::regex("\\s+"), "");
expression = boost::regex_replace(expression, boost::regex("\\s+"), "");

这具有同样的效果,所以我现在一直在使用它,但它肯定不理想!