升压:正则表达式块大小有限吗?

时间:2014-07-17 10:40:21

标签: c++ regex boost

我有一个很大的文本文件要通过boost解析:正则表达式。为了简化过程,首先我决定将大文件拆分为块,以便将来解析每个块。

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

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

它允许我在“FIRST1 FIRST2 FIRST3”和“LAST1 LAST2 LAST3”之间接收我想要的所有内容。

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

  • FIRSTS part1 LASTS - 一切解析好
  • FIRSTS part2 LASTS - 一切解析好
  • FIRSTS part1part2 LASTS - break。

我认为可能会提升:正则表达式限制,并在此处尝试:online regex,它仍然相同。

看起来part1part2对于regex块来说太大了,是不是真的?是否有正则表达式的大小限制,或者我只是搞砸了什么?

UPD:

我还发现了最大尺寸。它创建子字符串,如果它是字符[106-12131],但如果我将任何一个字符添加到子字符串的任何位置,它就找不到它。所以,它是12025。

1 个答案:

答案 0 :(得分:1)

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

我会告诉你Spirit有效地做到这一点的方法,但你没有显示相关的代码,所以我会等。

也就是说,至少让群组成为非捕获群体(例如((.*?\r*\n*)*)),并考虑使用cmatch代替smatchdocs

哦,这可能是灾难性回溯的案例 [¹]

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

尝试这样的事情:

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

使其不被捕获:

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