Проверить, покрывает ли одно регулярное выражение другое регулярное выражение

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

Предположим, что нас интересуют толькорегулярные выражения с подстановочными знаками '*' и '+', т.е. '*' означает ноль или более вхождений алфавита, а '+' означает 1 или более вхождений алфавита. алфавит. Также предположим, что набор символов - ASCII.

Например:

1. AB covers AB
      This is straightforward.
2. ABC* covers ABC
      Because ABC* can generate: ABC, ABCC, ABCCC etc.
3. A*B+C* covers AB+C*
      Because A*B+C* can generate ABBC, AABBC, AABBCC etc. which covers
      all strings generated by AB+C*.
4. A+M+BC* covers AMM+B+C+M+BC*
      Similar to case [3] above.

В основном я ищу эффективную реализацию следующего метода, который сообщает, покрывает ли strA (может содержать регулярное выражение) strB (может содержать регулярное выражение). Обратите внимание, что также должен быть способ экранировать символы регулярного выражения '*' и '+' во входных строках strA и strB.

Сигнатура метода в C++:

bool isParentRegex(const string& strA, const string& strB)

Я думаю, что для реализации требуется рекурсивный подход, и он может быть немного сложным. Но мне любопытно узнать, могу ли я повторно использовать существующие реализации вместо того, чтобы заново изобретать колесо, или есть ли другие простые способы сделать это.

8
задан Kowshik 4 July 2012 в 04:54
поделиться