将字符串String与Java中的大型正则表达式,性能匹配

时间:2014-10-09 22:45:56

标签: java regex string list

我有以下内容:

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()直到我得到一个匹配,我记下来并保存在其他地方,然后我突破迭代通过模式并继续列表中的下一个字符串。

这是一个分类工作,因此几个字符串可以匹配相同的模式。

我的问题是,这当然需要大量的执行时间,我正在寻找一种更有效的方法来解决这个问题。

有什么建议吗?

2 个答案:

答案 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/