【发布时间】:2014-07-30 06:49:28
【问题描述】:
在 erlang 中使用大型正则表达式时,我得到了 error:{badmatch,{error,{"regular expression is too large",29899}}}。这是连接表达式,但我真的需要它,因为它比迭代抛出几个正则表达式更有效。
我在“大小和其他限制”部分中读到http://www.pcre.org/pcre.txt,PCRE 可以用更大的链接大小进行编译,以处理真正巨大的正则表达式。
有没有办法用 erlang 做到这一点?
我已经从 homebrew 安装了最新的稳定版本 17.1。
【问题讨论】:
-
你是如何得到这个错误信息的?我已经过滤了源代码,找不到可以发出此消息的模块。
-
[H | T] = [ "\d+ abc" || _ <- lists:seq(1,10000)].SuperRegexp = lists:foldl(fun(R, SR) -> SR ++ "|" ++ R end, H, T).re:compile(SuperRegexp).{error,{"regular expression is too large",69999}} -
好的,re:compile/1 是梁库的一部分,而不是 re 模块(我不知道存在)并且检查似乎是在这个库中完成的 - 至少消息在库文件中。没有flag可以修改你启动erl的limit wen,所以恐怕没有简单的方法让它起作用。
-
我发现 re2 库 (github.com/tuncer/re2) 没有这么严格的限制。它还有 max_mem 选项,允许使用非常庞大的正则表达式。所以,我的问题解决了。谢谢
-
很高兴知道,如果其他人尝试解决相同的问题,您应该将其作为答案并将其标记为已解决。