7
votes

Structure de données pour représenter des motifs dans les chaînes

Je recherche une bonne structure de données pour représenter les chaînes de la forme:

JBoss:*
*:*
JBoss:type=ThreadPool,*
JBoss:type=Thread*,*
JB*:name=http1,type=ConnectionPool
  • Chaque "domaine" peut contenir les caractères de modèle suivants - * code>, ? code> ( * code> - 0 ou plus caractères, ? code> - 0 ou 1 caractère) p> li>

  • Chaque "clé" peut contenir les caractères de modèle suivants - * code>, ? code> ( * code> - 0 ou plus de caractères, ? code> - 0 ou 1 caractère) p> li>

  • Chaque "valeur" peut contenir les caractères de modèle suivants - * code>, ? code> ( * code> - 0 ou plus de caractères, ? code> - 0 ou 1 caractère) p> li> ul>

    EXEMPLES: P>

    Domain:Key1=Value1,Key2=Value2...
    


2 commentaires

Comment résolvez-vous les conflits sur les règles de correspondance, est-ce comme un match de préfixe le plus long? Par exemple, si vous aviez les deux règles, JBoss: * et *: *, JBoss: la clé = la valeur correspondrait à la fois. Vous choisissez-vous le match le plus long?


Bonjour Kyun, tu as raison, je choisirais le plus long match.


3 Réponses :


1
votes

Je pense que le moyen le plus simple de le faire serait de construire un NFA comme Trie , une qui permet des transitions à plusieurs états. Ceci, bien sûr, ajoute la complexité d'avoir une autre structure de données qui correspond à plusieurs états donnés à un ensemble de caractères à correspondre. Par exemple, avec votre exemple: xxx

permet d'essayer de correspondre à correspondre à "code> jboxx: nom = *

lorsque vous faites correspondre la sous-chaîne JO , vous auriez besoin d'une structure de données pour contenir les états jbo et jb * et * car vous avez trois branches à ce point. Lorsque le x est entré dans, vous pouvez supprimer la route JO depuis son impasse et utilisez jb * et * . La mise en œuvre facile consiste à disposer d'un ensemble d'états de match possibles à tout moment et d'essayer le caractère suivant sur chacun d'eux. Vous auriez également besoin d'un moyen de résoudre plusieurs matchs (comme dans ce cas) - peut-être quelque chose d'aussi simple qu'un plus long match?

Tout semble avoir du sens lorsque vous pensez à la Trie comme une NFA au lieu du format DFA bien accepté. J'espère que cela pourra aider.


2 commentaires

Kyun, merci pour les suggestions. Je crois qu'un problème similaire existe dans le thème routage dans les cadres de messagerie où des messages doivent être routés en fonction de schémas similaires. Voici un lien: rabbbitmq.com/blog/tag/dfa


Semble très similaire! J'étais sur le point de suggérer de convertir vos règles à une DFA une fois que vous avez la NFA, mais que vous feriez probablement vos mises à jour de règles plus lentes?



0
votes

Je pense que vous voulez utiliser un corde


0 commentaires