Comment puis-je écrire une fonction simple d'appariement de motifs d'expression régulière en C ou C ++?
C'est une question dans mon article de test aujourd'hui, la signature de la fonction est
int is_match(char* pattern,char* string)
Le modèle est limité à seulement ASCII caractères et la quantification *
et ?
de sorte qu'il est relativement simple. is_match
doit retourner 1 si égalé, sinon 0.
Comment puis-je faire cela?
source d'informationauteur Tracy
Vous devez vous connecter pour publier un commentaire.
Voir Cette Question pour une solution que vous ne pouvez pas soumettre. Voir ce document pour une description de la façon de mettre en œuvre un plus lisible.
Brian Kernighan un court article sur Une Expression Régulière Matcher que Rob Pike écrit comme un programme de démonstration pour un livre qu'ils ont à travailler sur. L'article est une très belle lecture expliquer un peu sur le code et les expressions régulières en général.
J'ai joué avec ce code, en faisant quelques changements à expérimenter avec des extensions comme aussi de retourner là d'où dans la chaîne de la répétition des matchs, de sorte que la sous-chaîne correspondant au modèle peut être copié à partir du texte original.
De l'article:
Le réel de code source C de l'article est très très agréable.
Tricher. Utilisation
#include <boost/regex/regex.hpp>
.N'ai pas tester, en fait le code, ou de débogage, mais cela pourrait vous obtenir un début...
essayez de faire une liste intéressante des cas de test:
et ainsi de suite ...
puis voir comment faire le plus facile du test, puis le suivant ...
Toute la puissance des expressions régulières, et des machines à états finis ne sont pas nécessaires pour résoudre ce problème. Comme alternative, il est relativement simple de programmation dynamique de la solution.
Laissez match(i, j) 1 si il est possible de faire correspondre la sous-chaîne chaîne[i..n-1] avec le sous-modèle modèle[j, m - 1], où n et m sont les longueurs des chaîne et modèle respectivement. Sinon, laissez-match(i, j) 0.
La base de cas sont les suivants:
match(n, m) = 1, on peut faire correspondre une chaîne vide avec un pattern vide;
match(i, m) = 0, vous ne pouvez pas correspondre à une chaîne non vide avec un pattern vide;
La transition est divisé en 3 cas selon que le sous-modèle commence avec un caractère suivi par un '*', ou un caractère, suivi par un '?' ou juste commence avec un personnage qui n'a aucune symbole spécial après.
Le temps de la complexité de cette approche est de O(n * m). La mémoire de la complexité est également en O(n * m), mais avec une simple modification peut être réduite à O(m).
Récursive Simple de mise en œuvre. C'est lent mais facile à comprendre:
Espère que je l'ai eu tout droit.
Un programme C pour trouver l'indice,d'où le sous-chaîne dans la chaîne principale va commencer.
entrez le code ici