我希望能够解决像这个问题一样的问题:如何让std::ifstream处理LF,CR和CRLF?其中一个
istream
需要通过复杂的分隔符进行标记化;唯一的标记化istream
的方法是:
- 逐个字符读取
istream
- 收集这些字符
- 当遇到分隔符时,将收集的内容作为标记返回
使用正则表达式可以很好地将字符串与复杂分隔符分词:
string foo{ "A\nB\rC\n\r" };
vector<string> bar;
// This puts {"A", "B", "C"} into bar
transform(sregex_iterator(foo.cbegin(), foo.cend(), regex("(.*)(?:\n\r?|\r)")), sregex_iterator(), back_inserter(bar), [](const smatch& i){ return i[1].str(); });
但是我无法在istream
上使用regex_iterator
:( 我的解决方案是将istream
读入内存,然后对其运行regex_iterator
,但这一步似乎是多余的。
是否存在istream_iterator
和regex_iterator
的奇怪组合?或者如果我需要它,我必须自己编写它?