Regex Matching в Java Улучшение производительности - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь сопоставить большие регулярные выражения в многострочных текстах. Время выполнения занимает около 3-4 минут для некоторых регулярных выражений. Это в основном приводит к проблемам с производительностью. Фрагмент кода

boolean matchedRegex = false;

for (Rules rule : rules) {
    String mergedRegex = rule.getRegexes().stream().collect(Collectors.joining("|"));
    final Pattern pattern = Pattern.compile(mergedRegex, Pattern.MULTILINE | Pattern.DOTALL);
    System.out.println(String.format("Pattern: %s", pattern));
    if (pattern.matcher(text).find()) {
        matchedRegex = true;
        break;
    }
}
mergedRegex = "(?=.*MORTGAGE\b)(?=.* This Security Instrument is given to\b).*|(?=.*MORTGAGE\b)(?=.*Words used in multiple sections|WORDS USED OFTEN IN THIS DOCUMENT|The date of this Mortgage\b)(?=.*Security Instrument).*|(?=.*\bTHIS MORTGAGE made\b)(?=.*\bWITNESSETH\b).*|(?=.*\bMORTGAGE\b)(?=.*\bTHIS INDENTURE\b)(?=.*made the).*|(?=.*\bThis bond and mortgage\b)(?=.*\bmade the day of\b)(?=.*\bWitnesseth\b).*|(?=.*\bTHIS MORTGAGE\b)(?=.*\bis made this|is given on|is given to|by and between|is made on|entered into this\b).*|(?=.*\bCREDIT MORTGAGE\b)(?=.*Space Above This Line For Recording Data).*|(?=.*\bDOWN PAYMENT ASSISTANCE MORTGAGE\b)(?=.*THIS MORTGAGE).*|(?=.*\bSECURITY DEED\b)(?=.*\bWords used in multiple sections\b)(?=.*Security Instrument).*|(?=.*DOWN PAYMENT ASSISTANCE MORTGAGE\b)(?=.*\bmade and entered\b).*";

Что я могу сделать здесь для повышения производительности, так это объединить регулярные выражения, присутствующие внутри rule.getRegexes(), в одно консолидированное регулярное выражение И, наконец, я выполняю объединенное регулярное выражение для каждого правила.

1 Ответ

1 голос
/ 02 апреля 2020

Полагаю, это неструктурированный документ. Я не вижу способа оптимизации Regex, кроме подхода к документу.

Это зависит от того, насколько каждый документ является регулярным, прогнозным и структурированным. Есть несколько способов go:

  • Придерживаться текущего решения, но немного изменить подход. Разделите документ на куски, если структура позволяет это. Вместо этого выполните несколько целевых поисков в меньших разделах, чем во всем документе. Преимущество также заключается в том, что вы можете получить представление о том, что вы можете ожидать в каждом разделе, и Regex для каждого из них становится меньше и быстрее.
  • Индексируйте документ и ищите инструменты, специализированные для интеллектуального анализа текста. Если документ сгенерирован из некоторых структурированных данных, таких как XML, поработайте с ними.
...