Один из вариантов - создать один детерминированный автомат, который может соответствовать всем регулярным выражениям параллельно.Один из способов сделать это будет следующим:
- Преобразование каждого регулярного выражения в недетерминированный автомат с использованием одного из многих стандартных алгоритмов преобразования.
- Введение нового начального состояния с помощью ε-переходовко всем начальным состояниям этих автоматов.Это эффективно создает один автомат, который запускает все автоматы регулярного выражения параллельно.Убедитесь, что каждое состояние принятия в NFA помечено по-разному, чтобы было ясно, какому регулярному выражению соответствует каждое состояние принятия.
- Используя конструкцию подмножества, сократите этот NFA до DFA.Во время этого процесса, помечая состояние как принимающее, помните, какие из автоматов считали это состояние принимающим.
- Создайте реализацию DFA на основе таблицы.
Теперь,всякий раз, когда вы получаете новое сообщение, вы можете запускать управляемый таблицей DFA для этого сообщения, которое эффективно выполняет каждое регулярное выражение параллельно и возвращает совпадения регулярных выражений, если они есть.Это может иметь большие затраты в памяти, поскольку сгенерированный DFA может быть довольно большим, но время для сопоставления с любым входящим регулярным выражением будет линейным по размеру соответствующей строки.