首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex表达式花费太多时间

Regex表达式花费太多时间
EN

Stack Overflow用户
提问于 2016-02-05 09:35:54
回答 1查看 934关注 0票数 0

我在Java代码中有下面的regex表达式,在某些情况下需要很长时间才能完成。有什么办法可以改进吗?

代码语言:javascript
复制
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仓库保护计划:

EN

回答 1

Stack Overflow用户

发布于 2016-02-05 10:51:01

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

代码语言:javascript
复制
_data = _data.replaceAll("\\Q" + m.group(0) + "\\E", ".");

就字符串长度而言,它是O(n**2)。别这么做。

你可以用更简单的方法

代码语言:javascript
复制
_data = _data.replace(m.group(0), ".");

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

此外:

  • 使用非捕获组。
  • 考虑使用MatcherusePattern(Pattern)循环利用。
  • 考虑将所有的模式合并为一个。因为它们都是一样的,它可能是相当有效率的。
  • 如果没有匹配,您的decimal可能会变慢。忽略了可选的部分,您将得到"([0-9]+)+",它可以不必要地回溯很多。考虑使用原子组。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35220665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档