我正在尝试提高某些代码的性能。它看起来像这样:
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()的性能,因为它被调用了数百万次,而模式的初始化只进行了一次。
答案 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所有模式的大正则表达式;那么对于每个输入你只匹配一次。