我在Java代码中有下面的regex表达式,在某些情况下需要很长时间才能完成。有什么办法可以改进吗?
String decimal = "([0-9]+(\\.[0-9]+)?[/-]?)+";
String units = "(in|ft)\\.?";
String unitName = "(cu\\.? *ft|gauge|watt|rpm|ft|lbs|K|GPF|btu|mph|cfm|volt|oz|pounds|dbi|miles|amp|hour|kw|f|degrees|year)";
sizePattern.add(Pattern.compile("(?i)" + decimal + " *" + units + " *x? *" + decimal + " *" + units + " *x? *" + decimal + " *" + units + ""));
sizePattern.add(Pattern.compile("(?i)" + decimal + " *" + units + " *x? *" + decimal + " *" + units));
sizePattern.add(Pattern.compile("(?i)" + decimal + " *x *" + decimal + " *" + units));
sizePattern.add(Pattern.compile("(?i)" + decimal + "( *" + units + ")"));
sizePattern.add(Pattern.compile("(?i)" + decimal + "( *sq?\\.?)( *ft?\\.?)"));
sizePattern.add(Pattern.compile("(?i)" + decimal + " *" + unitName));
sizePattern.add(Pattern.compile("(?i)" + decimal + "(d)"));
sizePattern.add(Pattern.compile("(?i)" + decimal + "( *(%|percent))"));
sizePattern.add(Pattern.compile("(?i)" + decimal));
for (Pattern p : sizePattern)
{
ODebug.Write(Level.FINER, "PRD-0079: Using pattern = " + p.pattern());
m = p.matcher(_data);
while (m.find())
{
ODebug.Write(Level.FINER, " Got => [" + m.group(0) + "]");
this.Dimensions.add(m.group(0));
_data = _data.replaceAll("\\Q" + m.group(0) + "\\E", ".");
m = p.matcher(_data);
}
}导致问题的字符串:
微型电磁炉提供最佳的顶部性能,安全和效率。感应加热,因为电流流经线圈产生磁场下的陶瓷板。当铁磁炊具放置在陶瓷表面时,会在炊具中产生电流,并由于锅的电阻而产生瞬间热。只产生热量到锅上,没有热量损失。由于没有明火,使用感应器比传统的燃烧器更安全。一旦厨具被移除,所有的分子活性都会停止,并且停止加热immediately.Flush表面的内置或独立的applicationDual功能:库克和Warm7电源设置(100-300-500-700-900-900-1100-1300 W)*两个最低功率设置实际上无法实现,但是否“模拟”:100 W=500 W间歇加热2秒,停止8 seconds300W =500 W间歇加热6秒,停止4 seconds13保温设置seconds13敏感面板,控制lockUp至8小时微晶陶瓷plateAutomatic pan detectionLED专题小组ETL/ETL-卫生/FCC认证的家庭或商业useHome仓库保护计划:
发布于 2016-02-05 10:51:01
假设你的_data很长,不是匹配需要时间,而是分配
_data = _data.replaceAll("\\Q" + m.group(0) + "\\E", ".");就字符串长度而言,它是O(n**2)。别这么做。
你可以用更简单的方法
_data = _data.replace(m.group(0), ".");但别这么做。你最后需要减少_data吗?如果是这样的话,每个模式使用一个replaceAll (它在内部使用一个StringBuffer,并且只在字符串大小上是线性的)。
此外:
Matcher和usePattern(Pattern)循环利用。decimal可能会变慢。忽略了可选的部分,您将得到"([0-9]+)+",它可以不必要地回溯很多。考虑使用原子组。https://stackoverflow.com/questions/35220665
复制相似问题