如何跟踪正则表达式中的灾难性回溯?

时间:2016-01-25 05:51:06

标签: java regex backtracking

我使用Apache regexp作为库来验证正则表达式。我想知道如何跟踪一些正则表达式是否导致灾难性的回溯。 我想知道的是,是否有一些技巧可以捕获导致灾难性回溯的正则表达式和字符串值? 我在RE.java类中尝试了一点修改,但没有像预期的那样。

我的修改:

    public RE(String pattern) throws RESyntaxException
{
    this(pattern, MATCH_NORMAL);
    paramString = pattern;
}


public RE(String pattern, int matchFlags) throws RESyntaxException
{
    this(new RECompiler().compile(pattern), matchFlags);
    paramString = pattern;
}


int callcounterMN = 0;
protected int matchNodes(int firstNode, int lastNode, int idxStart)
{
    callcounterMN++;
    if (callcounterMN == 100) {
        try {
            String pc1 = new Exception().getStackTrace()[5].getClassName();
            if (pc1.indexOf("UpdateWebForm") > 1)     
                System.out.println("regex loop reach "+callcounterMN+"  with regex : "+paramString+" "+this.search.substring(0));
        } catch (Exception e) {}
    }

1 个答案:

答案 0 :(得分:1)

很久以后,但考虑到仍然没有答案,我可能会投入:谷歌的RE2正则表达式库旨在完全阻止灾难性的回溯问题,有时候会牺牲一些绩效水平:https://github.com/google/re2/wiki/WhyRE2

这不是你的问题的答案,因为这是关于接受任何正则表达式并确保它永远不会导致灾难性的回溯挂起,而不是检测那些将使用Apache库但是希望它对这个问题的一些访问者仍然是有用的输入。如果你能够不支持某些正则表达式模式结构,在某些情况下你可以承受性能损失,并且你可以负担测试和交换你正在使用的库 - 那么你可能已经解决了问题。