boost:regex 块大小是不是受到限制?
Posted
技术标签:
【中文标题】boost:regex 块大小是不是受到限制?【英文标题】:Is boost:regex block size limited?boost:regex 块大小是否受到限制? 【发布时间】:2014-07-17 10:40:20 【问题描述】:我有相当大的文本文件要通过 boost:regex 解析。为了简化处理,首先我决定将大文件拆分为块,以便将来解析每个块。
我为此使用下一个正则表达式字符串:
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 - 休息。我以为可能是 boost:regex 的限制,在这里试了一下:online regex,还是一样。
看起来 part1part2 太大而无法返回正则表达式块,是真的吗?正则表达式有大小限制,还是我搞砸了?
更新:
我还找到了最大尺寸。如果它是字符[106-12131],它会找到子字符串,但是如果我将任何一个字符添加到子字符串的任何位置,它就找不到它。所以,是 12025。
【问题讨论】:
您是否试图隐藏您正在使用正则表达式解析 html/XML? :) 否 :-) 我正在尝试解析来自 PBEM 游戏的报告。有很多文字,结构很好。仍然很大,被许多部分与单位的状态、地区等分开。 如果您以共享实际文件为例... 【参考方案1】:你可能不应该在这里使用正则表达式。
我会向您展示有效执行此操作的 Spirit 方法,但您没有显示相关代码,所以我会等待。
也就是说,至少使这些组成为非捕获组(例如,此处为((.*?\r*\n*)*)
)并考虑使用cmatch
而不是smatch
(docs)
哦,这可能是灾难性的回溯 [¹]:
((.*?\r*\n*)*)
试试这样的:
(.+?[\r\n]+)*
也让它不被捕获:
(?:.+?[\r\n]+)*
【讨论】:
它不适用于 +,因为有时会有空字符串(仅使用 \r\n),但 (?:.+?[\r\n]+)* 效果更好,现在可以捕获超过 12025 个符号... 关键是要避免灾难性的回溯。太多的嵌套量词,特别是当可能为空时,是一个秘诀。您只需将尽可能少的事情设为可选,并始终从最细粒度的级别(自上而下)开始。 我猜应该通过标准 C++ std::string 方式(find/substr)将大文件拆分为小部分,然后将正则表达式与文本的小分隔部分一起使用已解析。以上是关于boost:regex 块大小是不是受到限制?的主要内容,如果未能解决你的问题,请参考以下文章
作为一门语言,Python 是不是因为没有 end 语句而受到限制?