Как использовать регулярное выражение (glob) для поиска в дереве файлов

Как мне адаптировать дерево поиска для обработки ограниченного количества регулярных выражений?

Учитывая имя файла, мне нужно найти все узлы, соответствующие этому имени файла. Узлы могут содержать обычные символы имени файла (* и?). Поскольку это дерево поиска, скорость имеет решающее значение.

Я должен добавить, что наиболее важным аргументом в пользу скорости является среднее время до исключения матча. В большинстве случаев сопоставление не удается.

Если дерево содержало следующие узлы:

foo, bar, foo*, *bar, foo?bar 
  • Поиск «foo» вернет узлы 1 и 3.
  • Поиск «bar» вернет узлы 2 и 4.
  • Поиск по запросу «брелок» не вернет узлов.
  • Поиск "fooxbar" вернет узел 5.
  • Поиск "foobar" вернет узлы 3 и 4.

Ответов (1)

Решение

Ахо-Corasick дерево поиска будет соответствовать требованиям. « Попытки » - очень хорошая статья о подобных вещах и реализации Etrie, используемой в Evolution для замены поиска по регулярным выражениям.

Чтобы выполнить полное сопоставление строки, вы можете добавить начальное и конечное состояния привязки. При сканировании многострочных данных вы можете добавить новую строку в начало и конец. Вы также можете удалить часть, в которой добавляется перекрестная ссылка для частичного сопоставления, начиная с другого сопоставления. Это также позволяет быстрее исключить.

Другой алгоритм проверки принадлежности к набору строк - CritBit . У него нет Regex, но он прост и проверяет полные строки.