正则表达式花费了太多时间

时间:2016-02-05 09:35:54

标签: java regex performance

我在Java代码中有以下正则表达式,在某些情况下需要花费大量时间才能完成。有没有办法改善它?

[{
    "name": "sonia",
    "emails": [{
        "email": "abc@gmail.com",
        "type": "Work"
    }, {
        "email": "xyz@gmail.com",
        "type": "office"
    }]    
}]

导致问题的字符串:

Micro-Induction Cooktop提供最佳的灶具性能,安全性和效率。当电流流过线圈以在陶瓷板下产生磁场时,感应加热。当将铁磁炊具放置在陶瓷表面上时,在炊具中感应出电流,并且由于锅的阻力而产生瞬间热量。仅向锅产生热量并且不会损失热量。由于没有明火,导入装置比传统燃烧器更安全。一旦炊具被移除,所有分子活动停止并立即停止加热。内置或独立应用的清洁表面双功能:Cook和Warm7功率设置(100-300-500-700-900-1100-1300W)* 2最低功率设置实际上无法实现,但是“模拟”:100W = 500W间歇加热2秒,停止8秒300W = 500W间歇加热6秒,停止4秒13保温设置(100-120-140- 160-180-190-210-230-250-280-300-350-390F)带控制锁的触摸敏感面板最多8小时计时器微晶陶瓷板自动平底锅检测LED面板CEL / ETL-卫生/ FCC认证适用于家庭或商业用途家用电器仓库保护计划:

1 个答案:

答案 0 :(得分:1)

假设你的_data很长,那不是匹配时间,而是分配

_data = _data.replaceAll("\\Q" + m.group(0) + "\\E", ".");

就字符串长度而言O(n**2)。只是不要这样做。

你可以用

更简单
_data = _data.replace(m.group(0), ".");

但是不要这样做。你最后需要减少_data吗?如果是这样,每个模式使用一个replaceAll(它在内部使用StringBuffer,并且只是字符串大小的线性)。

此外:

  • 使用非捕获组。
  • 请考虑使用Matcherreset(CharSequence)
  • 来回收usePattern(Pattern)
  • 考虑将所有模式合并为一个。因为所有这些都是相同的,所以它可能非常有效。
  • 如果没有匹配,您的decimal可能会变慢。离开可选部分,你得到的"([0-9]+)+"可以不必要地回溯。考虑使用原子组。