Я пытаюсь реализовать алгоритм кластеризации текста. Алгоритм группирует похожие строки необработанного текста, заменяя их регулярными выражениями, и агрегирует количество шаблонов, соответствующих каждому регулярному выражению, чтобы предоставить четкую сводку входного текста вместо отображения повторяющихся шаблонов из входного текста. В этой попытке я столкнулся с необходимостью выяснить, покрывает ли одно регулярное выражение другое.
Предположим, что нас интересуют толькорегулярные выражения с подстановочными знаками '*' и '+', т.е. '*' означает ноль или более вхождений алфавита, а '+' означает 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)
Я думаю, что для реализации требуется рекурсивный подход, и он может быть немного сложным. Но мне любопытно узнать, могу ли я повторно использовать существующие реализации вместо того, чтобы заново изобретать колесо, или есть ли другие простые способы сделать это.