5

我正在尝试提高某些代码的性能。它看起来像这样:

public boolean isImportant(String token) {
    for (Pattern pattern : patterns) {
        return pattern.matches(token).find();
    }
}

我注意到许多模式似乎是没有正则表达式构造的简单字符串文字。所以我想简单地将它们存储在一个单独的列表(importantList)中并进行相等测试,而不是执行更昂贵的模式匹配,如下所示:

public boolean isImportant(String token) {
    if (importantList.contains(token)) return true;

    for (Pattern pattern : patterns) {
        return pattern.matches(token).find();
    }        
}

如何以编程方式确定特定字符串是否不包含正则表达式结构?

编辑:我应该补充一点,答案不需要对性能敏感。(即可以使用正则表达式) 我主要关心 isImportant() 的性能,因为它被调用了数百万次,而模式的初始化只进行了一次。

4

4 回答 4

4

我通常讨厌这样说的答案,但是...

不要那样做。

它可能不会使代码运行得更快,实际上它甚至可能导致程序花费更多时间。

如果你真的需要优化你的代码,你可以去很多更有效的地方。

于 2013-03-05T22:32:00.387 回答
3

这将是困难的。您可以检查是否存在任何正则表达式元字符;这应该是一个很好的近似值:

Pattern regex = Pattern.compile("[$^()\\[\\]{}.*+?\\\\]");
Matcher regexMatcher = regex.matcher(subjectString);
regexIsLikely = regexMatcher.find();

值不值是另一个问题。您确定正则表达式匹配比列表查找慢(尤其是因为在许多情况下您将在此之后进行正则表达式匹配)?我敢打赌,保持正则表达式匹配会快得多。

于 2013-03-05T22:32:05.010 回答
2

没有办法确定它,因为每个正则表达式模式只不过是一个字符串。此外,现在几乎没有性能差异,因为正则表达式现在很聪明,我很确定,如果模式和源长度相同,那么首先要做的就是权益检查

于 2013-03-05T22:32:26.920 回答
1

这是错误的

    for (Pattern pattern : patterns) 

您应该创建一个对所有模式进行 OR 运算的大正则表达式;然后对于每个输入,您只匹配一次。

于 2013-03-05T22:55:28.840 回答