如何确定字符串是否不是正则表达式?

时间:2013-03-05 22:23:02

标签: java regex

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

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 个答案:

答案 0 :(得分:4)

我通常讨厌这样说但是......

不要那样做。

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

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

答案 1 :(得分:3)

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

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

是否值得这是另一个问题。你确定正则表达式匹配比列表查找慢吗(特别是因为在很多情况下你会在那之后进行正则表达式匹配)?我敢打赌,保持正则表达式匹配要快得多。

答案 2 :(得分:2)

没有办法确定它,因为每个正则表达式都只是一个字符串。此外,几乎没有性能差异,因为正则表达式现在是智能的,我很确定,如果模式和源长度相同,则股权检查是第一个完成的。

答案 3 :(得分:1)

这是错误的

    for (Pattern pattern : patterns) 

你应该创建一个ORs所有模式的大正则表达式;那么对于每个输入你只匹配一次。