c++ - 是 boost :regex block size limited?

标签 c++ regex boost

我有相当大的文本文件要通过 boost:regex 解析。为了简化过程,首先我决定将大文件拆分为 block ,以便将来解析每个 block 。

我为此使用下一个正则表达式字符串:

FIRST1.*?FIRST2.*?FIRST3((.*?\r*\n*)*)LAST1.*?LAST2.*?LAST3

它可以让我收到“FIRST1 FIRST2 FIRST3”和“LAST1 LAST2 LAST3”之间我想要的一切。

在它们之间存在许多行和许多文本(超过 20 000 字节)。它不起作用。如果我将文本分成两部分(第 1 部分 ~ 10 000 字节和第 2 部分 ~10 000 字节),并尝试使用此正则表达式:

  • 第 1 部分最后 - 一切都很好地解析
  • 第 2 部分最后 - 一切都很好地解析
  • 第 1 部分第 2 部分最后 - 休息。

我认为这可能是 boost:regex 限制,并在这里尝试:online regex , 还是一样。

看起来 part1part2 太大而无法返回正则表达式 block ,是这样吗?正则表达式是否有大小限制,还是我搞砸了?

更新:

我还找到了最大尺寸。如果是字符[106-12131],它会找到子串,但是如果我在子串的任何地方添加任何一个字符,它就找不到它。所以,它是 12025。

最佳答案

你可能不应该在这里使用正则表达式。

我会向您展示如何有效地执行此操作的 Spirit 方法,但您没有显示相关代码,所以我会等待。

也就是说,至少让组成为非捕获组(例如这里 ((.*?\r*\n*)*))并考虑使用 cmatch 而不是 smatch ( docs )

哦,这可能是灾难性回溯的情况[¹] :

((.*?\r*\n*)*)

尝试这样的事情:

(.+?[\r\n]+)*

也让它成为非捕获:

(?:.+?[\r\n]+)*

关于c++ - 是 boost :regex block size limited?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24801346/

相关文章:

c++ - 在模板 SFINAE 约束中使用间接级别会导致硬错误

c++ - _mm_packus_epi16 饱和问题

c++ - 尝试在 cmake 项目中包含 boost 后出现链接错误

C++ - 参数问题

.net - 由于 2 秒超时,并非所有 native 全局变量都在混合模式 .Net 应用程序中被破坏

java - 猜猜密码OOXML文件的应用?

javascript - 用于检查数字是 3 位还是 6 位十六进制的正则表达式

python - 使用正则表达式改变数字 Pandas

regex - 如何匹配所有不以/web开头的URL路径?

c++ - boost 构建 : Use a feature or a variable