Оптимизировать Java Регулярное выражение

1

У меня есть файл с такими огромными выражениями, как:

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)

как я мог бы сделать это более удобным и эффективным с очень большим количеством проверок?

  • 0
    Если ваш код работает, может быть лучше перейти на codereview.stackexchange.com
  • 0
    Являются ли string1, string2 ... литеральными строками?
Показать ещё 4 комментария
Теги:
performance
maintainability

2 ответа

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))");
  • 0
    +1 самый простой ответ, возможно, было бы лучше определить слова для переменных для лучшей наглядности и удобства обслуживания.
  • 0
    Да, я думал об этом варианте, но мне было трудно его поддерживать. Я мог бы написать функцию, которая генерирует это регулярное выражение из массива слов. Будет ли это выражение работать для строки, в которой много строк, например для html-страницы?
Показать ещё 12 комментариев
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;

Это облегчит проверку. Для определения исходного списка терминов возможно, что массивы будут работать лучше? Что-то вроде этого:

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

Что можно отформатировать, чтобы выглядеть красиво и может содержать комментарии и т.д....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню