- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我希望能够解决这样的问题:Getting std :: ifstream to handle LF, CR, and 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
覆盖它,但 slurping 这一步似乎是多余的。
是否存在 istream_iterator
和 regex_iterator
的邪恶组合,或者如果我想要它,我必须自己编写吗?
最佳答案
这个问题是关于代码外观的:
regex
一次只能处理 1 个字符,所以这个问题要求使用库一次解析 istream
1 个字符,而不是一次在内部读取和解析 istream
1 个字符istream
1 个字符仍会将该字符复制到临时变量(缓冲区),因此此代码试图避免在内部缓冲所有代码,这取决于库而不是抽象那个C++11 的 regex
es 使用不支持向前看或向后看的 ECMA-262:https://stackoverflow.com/a/14539500/2642059这意味着 regex
可以仅使用 input_iterator_tag
进行匹配,但显然在 C++11 中实现的那些不能。
boost::regex_iterator
另一方面支持 boost::match_partial
标志(即 not available in C++11 regex
flags 。)boost::match_partial
允许用户吞咽文件的 part 并在其上运行 regex
,如果由于输入结束而导致不匹配,regex
将在正则表达式中的那个位置“按住它的手指”并等待更多被添加到缓冲区。您可以在此处查看示例:http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/partial_matches.html在一般情况下,如 "A\nB\rC\n\r"
,这可以节省缓冲区大小。
boost::match_partial
有 4 个缺点:
"ABC\n"
这样可以节省用户 no 大小,他必须吞噬整个 istream
<boost
总是会导致膨胀回过头来回答这个问题:标准库 regex_iterator
不能对 input_iterator_tag
进行操作,需要整个 istream
。 boost::regex_iterator
允许用户可能 比整个 istream
吃得更少。因为这是一个关于代码外观的问题,而且因为 boost::regex_iterator
的最坏情况无论如何都需要对整个文件进行 slurping,所以这不是这个问题的好答案。
为了最好的代码外观,吞噬整个文件并在其上运行标准的 regex_iterator
是最好的选择。
关于c++ - 在 istream 上使用 regex_iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29895519/
我只找到了 regex_iterators 被初始化为 的例子 regex_iterator:: 如果我有一个包含一系列字符的类,例如: class fooString { private: de
我想对要跳过文本中某些字符的文本进行正则表达式搜索。此处提出的原始问题:Regular Expression library that maintains state, takes input cha
我试图通过逐行读取文件来从文件中获取一些匹配项。我的代码是这样的: std::regex e("id=\"(.+?)\"|title=\"(.+?)\"|summary=\"(.+?)\"|first
我需要一些帮助来了解如何迭代 boost::sregex_iterator 的搜索结果。基本上我传递了一个';'从命令行分隔的一组 IP 地址,我希望能够使用 boost::sregex_iterat
我一直在使用 std::regex_iterator 来解析日志文件。我的程序已经运行了几个星期并且已经解析了数百万行日志,直到今天,当今天我针对日志文件运行它并出现堆栈溢出时。事实证明,只有日志文件
我在使用 Visual Studio 2013,我看到了一个我认为是错误的东西,我希望有人可以确认吗? string foo{ "A\nB\rC\n\r" }; vector bar; for (sr
regex_token_iterator 和 regex_iterator 有区别吗? 看起来他们都做同样的工作,但不确定哪一个性能更好? 最佳答案 两者之间确实存在差异,如果我们查看 cpprefe
我希望能够解决这样的问题:Getting std :: ifstream to handle LF, CR, and CRLF? istream 需要用复杂的定界符标记;这样,标记化 istream
std::string line; 这会抛出 std::runtime_error what(): Memory exhausted: regex_it = boost::sregex_iterat
我正在使用 Boost 来匹配字符串中的子字符串。 Io 遍历结果,我需要使用 regex_iterator() . 那是我找到的唯一用法示例,但我不理解回调。有人可以给我一个函数的用法示例吗? 让我
我可以使用 g++ -c test.cpp -std=c++0x 创建 .o 文件,但无法链接它,出现下一个错误: test.cpp:(.text+0xe5): undefined reference
我一直在寻找一种计算字符串中特定类型的子字符串数量的好方法,比如说,我想计算字符串 'smstyuismsms' 中 'sms' 的出现次数。我在有人建议使用 regex_iterator 的论坛中找
我有几行简单的代码 std::regex_iterator regit (attributesStart, _curIter, _attributeRegex), regend(s
我正在阅读有关 std::regex_iterator 的文档因为我正在尝试学习如何使用它来解析 HTML 标签。网站给出的例子是 #include #include #include int
我是一名优秀的程序员,十分优秀!