我有相当大的文本文件要通过 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/