优化Java正则表达式

时间:2014-05-22 13:11:45

标签: java regex performance maintainability

我有一个包含大量if语句的文件:

if ((Pattern.compile("string1|String2|String3").matcher(text_str).find()) 
    && (Pattern.compile("String4|String5").matcher(text_str).find())
    && (Pattern.compile("String6|String7|String8").matcher(text_str).find())
    && (Pattern.compile("String9|String10").matcher(text_str).find())
    && (Pattern.compile("String11|String12").matcher(text_str).find())
    && (Pattern.compile("String13|String14").matcher(text_str).find())
    && (Pattern.compile("String15|String16").matcher(text_str).find())
    && (Pattern.compile("String17|String18").matcher(text_str).find())
    && (Pattern.compile("String19|String19|String20").matcher(text_str).find())
    ) {
    return true;

}

我基本上需要检查像(Pseudocode)这样的字符串:

String contains? (I have a) AND (cat OR dog OR fish) AND (and it) AND (eats OR drinks OR smells) AND (funny OR a lot OR nothing)

如何通过大量检查使这更加可维护和高效?

2 个答案:

答案 0 :(得分:2)

你可以使用一系列前瞻用一个正则表达式来做到这一点:

return text_str.matches("(?s)^(?=.*(string1|String2|String3))(?=.*(String4|String5))(?=.*(String6|String7|String8))(?=.*(String9|String10))(?=.*(String11|String12))(?=.*(String13|String14))(?=.*(String15|String16))(?=.*(String17|String18))(?=.*(String19|String19|String20))");

答案 1 :(得分:1)

那么你可以有一个List<List<String>>,你可以编译成List<Pattern>

for(List<String> terms : listOfTerms) {
    String pattern = StringUtils.join(terms, "|");
    patterns.add(Pattern.compile(pattern));
}

然后检查:

for(Pattern p : patterns)
    if(!p.matches(string))
        return false;

return true;

这应该使检查更容易。为了定义最初的术语列表,Arrays实际上可以更好地工作吗?像这样:

String[][] terms = {{"cat", "dog"}, {"a", "b"}...};

可以将其格式化为看起来不错并且可以包含注释等...