将字符串列表与正则表达式列表进行比较的算法

时间:2014-06-23 05:56:04

标签: java regex algorithm arraylist

我想从expList计算textToBeTested数组中单词的存在。

请注意,expList和textToBeTested数组都非常大。

我可以简单地遍历两个列表并使用“.matches”方法进行计数,但它在O(n ^ 2)中。

我可以使用更快的算法或实现吗?

    String[] expList = {"i", "i'd", "i'll", "i'm", "i'm", "bet[a-zA-Z]*", "my[a-zA-Z]*"};
    String[] textToBeTested = {"this", "is", "better", "than", "my", "method"};

e.g。在上面的textToBeTested数组中,“better”和“my”与expList数组中的字符串匹配,因此它将返回2.

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

如何将所有模式编译成使用交替的更大模式?如果正确编译成状态机,则替换可以快速(如Aho Corasick或KMP)。

boolean first = true;
StringBuilder sb = new StringBuilder();
for (String s : expList) {
    sp.append("(?:").append(Pattern.quote(s)).append(')');
    if (!first) {
        sb.append('|');
    }
    first = false;
}

Pattern pattern = Pattern.compile(sb.toString());

// Possibly make this a ForkJoinTask
int count = 0;
for (String s : textToBeTested) {
    if (pattern.matcher(s).matches()) {
        count++;
    }
}