/ / Dérive une expression régulière minimale à partir d'une entrée - c ++, c, regex, dfa

Dérivez une expression régulière minimale à partir d'une entrée - c ++, c, regex, dfa

J'ai un "agent" distant qui renvoie "oui" ou"non" quand on lui tend une ficelle. La communication avec cet agent est coûteuse et j'espère donc trouver une bibliothèque qui me permettra de construire de manière itérative une expression régulière avec des retours positifs et négatifs, tout en étant intelligente quant à sa construction. .

Par exemple, supposons que nous interrogions l'agent avec "bon" et recevions un "oui". L'expression régulière dérivée initiale doit être "bonne".

Supposons que j'interroge alors avec "goop" et reçoive un "oui". Je m'attendrais à ce que l'expression régulière dérivée soit "goo [dp]" et non "good | goop".

Et ainsi de suite.

Je n'ai pas besoin de revenir en arrière ou de quelque autre fantaisieopérations temporelles non linéaires dans ma regex dérivée. Vraisemblablement, la regex générée serait un DFA sous le capot. Est-ce que quelqu'un est au courant de l'existence de bibliothèques d'expressions régulières c / c ++ capables de le faire? Autrement, il serait utile de connaître les raisons pour lesquelles il s’agit d’une idée stupide et de meilleures solutions à mon vrai problème.

Réponses:

5 pour la réponse № 1

Plutôt qu'une expression régulière, vous pouvez utiliser un Trie.

Ensuite, pour chaque nouvelle corde, tu marches celui-cinoeud pour chaque personnage. Je suppose que vous voudriez également un caractère marqueur pour la fin de chaîne - une fois que vous atteignez ce caractère, si le noeud existe, il contient la réponse oui / non.


0 pour la réponse № 2

Eh bien, à moins que je ne manque quelque chose dans votre situation, je pense que la mémoire est assez peu coûteuse pour mettre en place immédiatement un cache stupide <std::string, bool>. Non seulement ce sera beaucoup plus facile à construire, maissera probablement plus rapide aussi, puisque vous construisez une carte de hachage. Le seul inconvénient, c’est que si vous interrogez le service distant avec un nombre incroyable de clés différentes, cette approche n’est peut-être pas la meilleure.