9
votes

Comment puis-je élargir un modèle fini dans toutes ses correspondances possibles?

Par exemple, étant donné le motif xxx pré>

une fonction prendrait le motif et renvoie une matrice ou une liste contenant P>

a_00, a_01, a_02, ... , a_98, a_99, ... , z_98, z_99


4 commentaires

C'est 5200 matchs. Sûr de vouloir l'avoir? Et désolé, je ne peux pas faire python ou perl.


Je serais aussi prudent. Le nombre de combinaisons possibles augmente de manière exponentielle par rapport à la longueur de la regex, de sorte que tout sauf chaînes courtes peut être très temps et mémoire consommant.


@etotheipi: Au lieu d'expliquer votre solution perçue au problème, dites-nous plutôt ce que vous essayez de réaliser ...


@Mitch Blé: Ceci est dans le top 10 des "Commentaires pour toujours". J'aimerais pouvoir le remettre plus d'une fois.


3 Réponses :


12
votes

Premièrement, analyser l'expression et construire un arbre reflétant la structure syntaxique de l'expression régulière et inclure un nœud Terminator qui apparaît logiquement à la fin. Par exemple, dans la notation LISP, votre exemple peut ressembler à ceci:

if node is of form (repeat n): # non-variable repeat
    for i in 1 to n
        recurse into child
    recurse into threaded successor

if node is of form (concat ...):
    recurse into first element # last element will recurse into successor

if node is of form (literal x):
    emit x
    recurse into successor
    remove x

if node is of form (charset ...):
    for each element in charset:
        emit element
        recurse into successor
        remove element

if node is terminator:
    add string created thus far to final output list


1 commentaires

Les réponses comme celle-ci font alors travailler. Merci pour une réponse aussi complète.



-1
votes

étant donné que vous pouvez comprendre la longueur des chaînes de longueurs correspondantes, vous pouvez brute la force la force en générant toutes les chaînes possibles avec les longueurs correctes, puis essayez simplement de correspondre.


0 commentaires

0
votes

Utilisez Thrapl !! THRAX fournit des outils de ligne de commande pour interagir avec la boîte à outils openfst robuste. Vous pouvez probablement le trouver sur les gestionnaires de paquets tels que apt code> ou Macports code>.

Voici un exemple de comment utiliser THRAX pour échantillonner une regex. Aujourd'hui, je voulais trouver un nom pour une bibliothèque que j'écris. Je voulais que le nom soit un acronyme pour complet incorporé? MRF? (Optimisation | Inference) Toolkit Code>. Après avoir essayé de trouver un nom manuellement, j'ai abandonné et écrivit la regex suivante pour d'éventuels acronymes: co? M? M? [IO] à? P>

Maintenant, le problème réduit l'échantillonnage des chaînes qui satisfont à cet acronyme. C'est là que la thrax est entrée. Nous pouvons d'abord écrire la regex dans un fichier grm code> comme celui-ci. P> xxx pré>

Vous pouvez probablement deviner ce qui se passe. Pour chaque x? Code> J'ai spécifié que x code> sera émis ou '' ' code> sera sorti. Maintenant, nous pouvons compiler ce GRM code> Fichier et des chaînes d'échantillonnage de la langue. P>

****************************************
comemoto
cmemot
****************************************
comemoto
comoto
****************************************
comemoto
comot
****************************************
comemito
coemito
****************************************
comemoto
coeot
****************************************
comemoto
cmeot
****************************************
comemito
coit
****************************************
comemoto
cemot
****************************************
comemoto
ceoto


0 commentaires