я следующее:Матч СТРОКА против большого списка регулярных выражений, производительности в Java
private static List<Pattern> pats;
Этот список содержит около 90 моделей, которые инстанцированы перед тем итерации. Шаблоны являются сложными, как:
System.out.println("pat: " + pats.get(0).toString());
// pat: \bsingle1\b|\bsingle2\b|(?=.*\bcombo1\b)(?=.*\bcombo2\b)|\bsingle3\b|\bwild.*card\b ...
Некоторые из образцов содержат около 40-50 отдельных слов или сочетания слов, как регулярное выражение выше шоу. Слова могут содержать подстановочные знаки.
Теперь у меня есть список строк, предложений по 30-60 символов. Я повторяю их и для каждой строки в списке, я повторяю их через список шаблонов и выполняю pattern.match("This is one of the strings in my list").find()
, пока не получу совпадение, которое я отмечаю и сохраняю где-то в другом месте, затем я выхожу из итерации через шаблоны и продолжаю следующую строку в списке.
Это задание на категоризацию, поэтому несколько строк могут совпадать по одному шаблону.
Моя проблема заключается в том, что это, конечно, требует много времени выполнения, я ищу более эффективный способ решить эту проблему.
Любые предложения?
Я думаю, что вы можете искать что-то вроде [алгоритм Ахо-Corasick] (https://en.wikipedia.org/wiki/Aho % E2% 80% 93Corasick_string_matching_algorithm). –
Вы можете попытаться оптимизировать свои регулярные выражения, это хорошая статья на нем. http://stackoverflow.com/questions/1252194/regex-performance-optimization-tips-and-tricks –
Я не думаю, что Aho-Corasick algoritm поддерживает подстановочные знаки, но это было интересно, и я нашел несколько реализаций, заметьте для себя для будущих потребностей. – Wrench