将字符串拆分为连续的非空白字符序列

时间:2018-03-27 00:08:11

标签: c++ regex

我想将一个字符串拆分成连续的非空白字符序列。例如,给定

std::string test(" 35.3881 12.3637 39.3485");

我想获得一个指向“35.3881”的迭代器,其增量指向“12.3637”,第二个增量指向“39.3485”。

在给定的示例中,可能(但不能保证)字符串以未知数量的空格开头。此外,非空白字符序列之间的空白数也是未知的。尾随空格也是可能的。

以下代码几乎解决了我的问题:

std::regex regex("\\s+");
std::sregex_token_iterator it(test.cbegin(), test.cend(), regex, -1);

即使使用给定的示例,问题在于迭代器it最初指向空字符串;这不是我想要的行为。我们如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

我只使用普通的stream_iterator:

std::istringstream test("  35.3881 12.3637 39.3485");

std::copy(std::istream_iterator<std::string>(test),
          {},
          std::ostream_iterator<std::string>(std::cout, "\n"));

结果:

35.3881
12.3637
39.3485

如评论中所述,如果您发现避免复制数据很重要,则可以使用istrstream代替instringstream,如下所示:

#include <strstream>
// ...

std::string test("  35.3881 12.3637 39.3485");
std::istrstream buffer(test.c_str());
std::copy(std::istream_iterator<std::string>(buffer),
          {},
          std::ostream_iterator<std::string>(std::cout, "\n"));

注意:<strstream>并且包含的​​所有内容都已正式弃用,因此从理论上讲,它可能会在标准的某些未来版本中消失。我最终希望看到一些基于string_view的东西,它也可以避免复制数据,但我不确定它是否真的存在(它当然不存在于我正在使用的编译器中)力矩)。