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

标签 c++ regex

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

std::string 测试("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 最初指向一个空字符串;这不是我想要的行为。我们如何解决这个问题?

最佳答案

我只使用普通的 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 的内容,这也可以避免复制数据,但我不确定它是否真的存在(它肯定不在我目前使用的编译器中)。

关于c++ - 将字符串拆分为连续的非空白字符序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49502491/

相关文章:

c++ - 如何让 WebSocket 服务器在 aws 上运行

regex - R:查找字符串中唯一字符的数量

regex - 在 grep 中抑制匹配本身

javascript - Prestashop Smarty 电子邮件正则表达式验证

用于提取价格信息的 Java Regex

c++ - XOR 128 位位集

c++ - Automake 不在子目录中生成 Makefile.in

python - 无法获得新的 tf.Operation 在 Tensorflow 的 Python shell 中工作

c++ - 不同 header 中的类不能相互识别?

javascript正则表达式问号(?)未检测到