/ / Wyprowadź minimalne wyrażenie regularne z danych wejściowych - c ++, c, regex, dfa

Wyprowadź minimalne wyrażenie regularne z danych wejściowych - c ++, c, regex, dfa

Mam zdalnego „agenta”, który zwraca „tak” lub„nie” po wręczeniu sznurka. Komunikacja z tym agentem jest droga, więc mam nadzieję znaleźć bibliotekę, która pozwoli mi iteracyjnie zbudować wyrażenie regularne, otrzymując pozytywne i negatywne opinie, a jednocześnie być inteligentnym w zakresie jego budowy. Pozwoli mi to buforować odpowiedzi po stronie wysyłającej .

Załóżmy na przykład, że pytamy agenta o „dobry” i otrzymujemy „tak”. Początkowe wyprowadzone wyrażenie regularne powinno być „dobre”.

Załóżmy, że pytam wtedy „goop” i otrzymuję „tak”. Spodziewałbym się, że pochodnym wyrażeniem regularnym będzie „goo [dp]”, a nie „good | goop”.

I tak dalej.

Nie potrzebuję cofania się ani żadnych innych fantazjinieliniowe operacje czasowe w moim pochodnym wyrażeniu regularnym. Przypuszczalnie wygenerowanym wyrażeniem regularnym byłby DFA pod maską. Czy ktoś wie o bibliotekach wyrażeń regularnych c / c ++ zdolnych do tego? Alternatywnie, przydatne byłyby również powody, dla których jest to głupi pomysł i lepsze rozwiązania mojego prawdziwego problemu.

Odpowiedzi:

5 dla odpowiedzi № 1

Zamiast wyrażenia regularnego możesz użyć Trie.

Następnie dla każdego nowego sznurka chodzisz po triewęzeł dla każdego znaku. Podejrzewam, że chciałbyś również znaku końca łańcucha - gdy osiągniesz ten znak, jeśli węzeł istnieje, zawiera odpowiedź tak / nie.


0 dla odpowiedzi nr 2

Cóż, chyba że coś mi brakuje w twojej sytuacji, myślę, że pamięć jest wystarczająco tania, aby po prostu wdrożyć głupi bufor - powiedzmy, nieuporządkowaną mapę <std::string, bool>. Będzie to nie tylko łatwiejsze do zbudowania, ale równieżprawdopodobnie też będzie szybszy, ponieważ budujesz mapę skrótów. Jedynym minusem tego jest to, że jeśli masz zamiar zapytać zdalną usługę za pomocą bazillionu różnych kluczy, może to nie być najlepsze podejście.