我有以下内容:
private static List<Pattern> pats;
此列表包含大约90个在迭代之前实例化的模式。模式很复杂,如:
System.out.println("pat: " + pats.get(0).toString());
// pat: \bsingle1\b|\bsingle2\b|(?=.*\bcombo1\b)(?=.*\bcombo2\b)|\bsingle3\b|\bwild.*card\b ...
正如上面的正则表达式所示,某些模式包含大约40-50个单词或单词组合。这些单词可以包含通配符。
现在,我有一个字符串列表,每个句子大约30-60个字符。我遍历它们并对列表中的每个字符串,我遍历模式列表并执行pattern.match("This is one of the strings in my list").find()
直到我得到一个匹配,我记下来并保存在其他地方,然后我突破迭代通过模式并继续列表中的下一个字符串。
这是一个分类工作,因此几个字符串可以匹配相同的模式。
我的问题是,这当然需要大量的执行时间,我正在寻找一种更有效的方法来解决这个问题。
有什么建议吗?
答案 0 :(得分:1)
解决我的问题(达到90%)的一件事是放弃正则表达式,String.indexOf()
从性能角度更有意义。
这篇文章激发了我的灵感:Quickest way to return list of Strings by using wildcard from collection in Java
我编写了自己的实现,因为链接中的那个只处理完整的单词,而我正在处理句子。
它有助于通配符“*”和管道“hel(l | lo)”在性能视角,前者比后者更多。
这个方向的原因是几个建议,它通过将时间减少200,000句从1.5小时减少到15分钟来提高性能。
答案 1 :(得分:0)
您还可以在专用服务中卸载正则表达式吗?我相信它比部分放弃正则表达式更快(也许更安全)?
如果您的应用程序要在多台服务器上运行,您也可以通过集中计算成本来获得性能。
以下是通过REST api实现此类实现的示例:http://www.rex-daemon.com/tutorial/more-advanced-queries/