我正在尝试使用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
,而不是我之后的事情!
答案 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+"), "");
这具有同样的效果,所以我现在一直在使用它,但它肯定不理想!