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

У меня есть динамический (иногда изменяющийся) массив регулярных выражений, например структура пути URL:

  • /(home)?$ -> домашний вид
  • /news/(index)?$ ->
  • /news/([a-zA-Z0-9_]+)/?$ -> просмотр новостной статьи ( arg_1 )
  • /news/([a-zA-Z0-9_]+)/reply_to_comment\?(.*) -> просмотр комментариев к новостям ( arg 1, arg 2 )
  • /(.+) -> 404 просмотр ( arg 1 )

Если есть столкновения, первое выражение - победитель. Например, последнее выражение соответствует всему, но в том случае, если ни одно выражение до этого не совпало. Или /news/index можно сопоставить со статьей, но индекс перед выражением статьи, поэтому он выигрывает.

Я хотел бы построить конечный автомат / дерево выражений, которое я могу использовать для сопоставления с любыми строками за O(n) времени, где n - длина строки, с которой выполняется сопоставление, то есть меня не волнует время, необходимое для построения этого дерева, но я хочу иметь одинаковую скорость сопоставления независимо от количества выражений.

Или хотя бы для "ограниченного" регулярного выражения, поддерживающего только: +, *, ?, [], [^ ], (), $, Лечи каждое выражение expr не начиная с ^ как будто это было написано как ^expr,

0 ответов

Другие вопросы по тегам