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

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

Один из сценариев, где это может быть полезно, - это REST web Сервисы. Предположим, я придумал несколько шаблонов URL для открытого интерфейса веб-службы REST:

  • / user / with-id / {userId}
  • / user / with-id / {userId} / profile
  • / user / with-id / {userId} / preferences
  • / users
  • / users / who-signed-up-on / {date}
  • / users / who-signed-up-between / {fromDate} / и / {toDate}

где {…} являются именованными заполнителями (например, группами захвата регулярных выражений).

Примечание: этот вопрос не о том, хорошо ли спроектирован вышеуказанный интерфейс REST или нет. (Вероятно, это не так, но это не должно иметь значения в контексте этого вопроса.)

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

Теперь веб-служба получает запрос. Конечно, можно последовательно сопоставить запрошенный URI с одним шаблоном URL, затем со следующим и так далее; но это, вероятно, не будет хорошо масштабироваться для большего количества шаблонов, которые необходимо проверить.

Существуют ли какие-либо эффективные алгоритмы для этого?

Входные данные:

  • Входная строка
  • Набор «взаимоисключающих» "регулярные выражения (т. е. никакая входная строка не может соответствовать более чем одному выражению)

Выходные данные:

  • Регулярное выражение (если есть), которому соответствует входная строка.
10
задан stakx supports GoFundMonica 13 August 2011 в 10:27
поделиться