代码之家  ›  专栏  ›  技术社区  ›  Martin Wiboe

为什么这些正则表达式在Java中执行缓慢?

  •  6
  • Martin Wiboe  · 技术社区  · 15 年前


    正则表达式如下:

    (\\s?[" + alphabet + "]{9,9})+
    

    确定输入是给定字母表中长度为9的一个或多个字符串,可能用空格分隔。

    (>[\\w\\s]+\\n[" + alphabet + "\\s]+)+
    

    检查输入是否在 FASTA format

    正则表达式在与 inputString.matches(regexString) . 为什么会这样?

    我想这可能是因为Java存储了所有可能的匹配(我现在不需要),但是添加了 ?:

    马丁

    编辑1: 我无法重现这个问题-它只发生在一台计算机上。这可能表明特定的VM设置有问题。
    我们需要更强大的东西,因此我们将以不同的方式实现这一点。我选择乔尔的答案是正确的,因为我相信模式中的某些特殊情况可能是原因。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Joel Hoff    15 年前

    如果有许多不同的正则表达式模式与同一个输入进行匹配,以尝试对输入进行分类,那么最好使用类似的词法分析器生成器 JFlex

    here .

        2
  •  1
  •   ddimitrov    15 年前

    string.matches()每次编译regex。相反,看看Pattern/Matcher类,它允许缓存预编译的regex。

    另一件事是如果不需要匹配的结果,就使用非捕获regex组。

        3
  •  1
  •   irreputable    15 年前

    这也许不能解释你的特殊问题。但有一次我深入到JDK的regex实现中,我惊讶于 纯朴的 它是。它并没有真正构建一个在每个输入字符处前进的状态机。我想他们有他们的理由。

    在您的情况下,您自己手工编写一个解析非常容易。人们害怕这样做,手工编写这些微小的步骤似乎是“愚蠢的”,人们认为,已经建立的库一定在做一些出色的技巧,以超越本土解决方案。那不是真的。在很多情况下,我们的需求是相当简单的,它是更简单和更快的DIY。