2

我有一个大(大于 200K)的字符串数组,用于搜索文档中的模式。在将数组中的每个条目应用于文档之前,我将其转换为正则表达式。当我这样做时,遍历数组并顺序执行搜索所需的时间会急剧增加。我相信这适用于我在执行搜索之前依次应用于每个正则表达式的 Pattern.compile 语句。预编译正则表达式可能是解决这个问题的一种方法,但我注意到当我这样做时内存使用量急剧增加。在预编译之前,Java 应用程序在大小约为 1.5 GB 的 VM 中运行。预编译后,java 程序在大小约为 14 gig 的 VM 中运行。

有没有一些优雅的方法来解决这个问题或让程序更有效地运行?

谢谢,

艾略特

4

1 回答 1

0

我会避免将所有正则表达式都编译在内存中,只需在使用前一一编译,并确保垃圾收集器可以清理使用过的正则表达式。这可以降低峰值内存使用量。

此外,理论上您可以使用捕获组和或运算符 (|) 将许多正则表达式合并到一个正则表达式中,然后单遍扫描文档,最后检查哪个匹配调用group()

这也有利于在编译阶段统一不同正则表达式的相似部分。

这是一个简单的示例,假设您匹配整个文档而不是查找或替换,只是为了说明这个想法:

String patternA = "patternA";
String patternB = "patternB";
Pattern compiled = Pattern.compile(String.format("(%s)|(%s)",patternA, patternB))
Matcher matcher = compiled.matcher(input);
if (matcher.matches()) {
  if (matcher.group(1)) {
    // patternA matched
  }
  if (matcher.group(2)) {
    // patternB matched
  }
}
于 2012-12-30T21:59:11.663 回答