【发布时间】:2018-09-06 05:13:37
【问题描述】:
我正在研究 scala/java 中一个非常通用的正则表达式案例。我有一组非常大的 url(~20 亿),我想根据它们匹配的正则表达式(~70k)为每个 url 分配一个 id。单个 url 可以映射到超过 1 个正则表达式。问题在于这组正则表达式。它们非常通用,因此会导致贪婪搜索。我试过使用 [\w\W]?代替 .(参见下面的示例)。但它仍然非常缓慢。我正在使用的环境是 Spark/scala。任何想法如何优化这个? 这是一个示例:
正则表达式示例: .*amazon.*desktop-dp.* 将其转换为 [\w\W]*?amazon[\w\W]*?desktop-dp[\w\W]*?
【问题讨论】:
-
我怀疑正则表达式是问题所在。不管你做得多快,比较 20 亿和 70k 都太慢了,即使正则表达式与加法花费的时间相同。
-
我认为如果你可以将大约 70K 的正则表达式合并到一个巨大的有限状态机中,你可以只扫描每个 URL 一次(而不是大约 70K)。但是,有限状态机有可能不适合内存...
-
[\W\w]为什么?为什么
[\W\w]比.更好??? -
你的正则表达式
.*amazon.desktop-dp.和它的替换[\w\W]?amazon[\w\W]?desktop-dp[\w\W]*只是非常轻微的相关。请修复所有错误并将您的代码用反引号括起来以正确格式化。还要添加更多的正则表达式......如果它们都像你展示的那样,我会使用别的东西。 -
@maaartinus 修复了正则表达式。 * 在堆栈溢出编辑框中也有特殊含义。
标签: java regex scala apache-spark optimization