2009-02-25 9 views
4

Quelqu'un sait comment adapter un arbre de recherche pour gérer des expressions régulières limitées? La tâche est, avec un nom de fichier, de trouver tous les nœuds correspondant à ce nom de fichier. Les noeuds peuvent contenir les globs de nom de fichier habituels (* et?). Évidemment, puisqu'il s'agit d'un arbre de recherche, la vitesse est essentielle.Arbre de recherche d'expressions régulières (glob)

EDIT: Je devrais ajouter que le cas le plus important pour la vitesse est le temps moyen pour écarter une correspondance. C'est-à-dire que dans la plupart des cas l'appariement échouera.

Un exemple: Dire l'arbre contenait les nœuds suivants:

foo, bar, foo *, * bar, foo bar

Recherche de foo renverrait noeuds 1 et 3. Recherche de bar? renverrait les nœuds 2 et 4. La recherche de fob ne retournerait aucun nœud. La recherche de fooxbar renvoie le nœud 5. La recherche de foobar renverrait les nœuds 3 et 4.

+0

Est-ce un problème inverse (de regex): correspondance si une chaîne appartient à une langue régulière ou pas? – dirkgently

+0

Pouvez-vous nous donner un échantillon d'E/S? – dirkgently

+0

Un exemple: Dites que l'arbre contenait les nœuds suivants: foo, bar, foo *, * bar, foo? Bar Étant donné une chaîne (par exemple foo, foobar, fooxbar, fob, etc.), trouvez rapidement le nœud (s), le cas échéant, qui correspondent à cette chaîne. –

Répondre

9

Un arbre de recherche aho-corasick correspondrait à l'addition. Aho-Corasick un très bon article sur ce genre de chose Tries, et la mise en œuvre utilisée dans Evolution pour remplacer regex recherche Etrie

Edit: Pour la mise en correspondance toute la chaîne, vous pouvez ajouter début et de fin des états d'ancrage, si la numérisation des données de plusieurs lignes , vous pouvez ajouter la nouvelle ligne pour commencer et terminer. Vous pouvez également supprimer la partie où il ajoute la liaison croisée pour la correspondance partielle en commençant une correspondance différente, ce qui permet également une exclusion plus rapide.

Un autre algorithme pour vérifier l'appartenance à un ensemble de chaînes est CritBit. Cela n'a pas Regex, mais c'est simple et tester des chaînes complètes.

+0

Cela semble très prometteur, bien que je veuille faire correspondre toute la chaîne d'entrée, pas les sous-chaînes à l'intérieur. Je vais lire les liens et confirmer que cela correspond à la facture. –

+0

Vous pouvez ajouter une nouvelle ancre de début de ligne, ou si vous scannez des meules de foin multi-lignes et ajoutez la ligne se terminant à l'avant de l'aiguille. par exemple "\ nsearch string". – sfossen

Questions connexes