Je ne suis pas nouveau dans l'utilisation des expressions régulières, et je comprends la théorie de base sur laquelle elles sont basées - les machines à états finis.
Je ne suis pas si bon en analyse algorithmique et je ne comprends pas comment une expression régulière se compare à une recherche linéaire de base. Je demande parce qu'en surface, cela ressemble à une recherche de tableau linéaire. (Si l'expression régulière est simple.)
Où pourrais-je aller pour en savoir plus sur l'implémentation d'un moteur regex?
C'est l'un des contours les plus populaires: la correspondance d'expressions régulières peut être simple et rapide . L'exécution d'une expression régulière compilée par DFA sur une chaîne est en effet O (n), mais peut nécessiter jusqu'à O (2 ^ m) de temps/espace de construction (où m = taille d'expression régulière).
Connaissez-vous le terme Automates finis déterministes/non déterministes ?
Real expressions régulières (quand je dis real je me réfère à ces expressions régulières qui reconnaissent les langues régulières , et non l'expression régulière que presque tous les langages de programmation incluent avec des références arrières, etc.) peut être convertie en DFA/NFA et les deux peuvent être implémentées de manière mécanique dans un langage de programmation (un NFA peut être converti en DFA)
Ce que vous devez faire, c'est:
De cette façon, étant donné une expression régulière, vous pouvez la convertir en DFA et l'exécuter pour voir si elle correspond ou non à un texte spécifié.
Cela peut être implémenté dans O(n)
, car DFA ne revient pas en arrière (comme une machine de Turing ), il correspond donc à la chaîne ou pas. Cela suppose que vous ne prendrez pas en compte les correspondances qui se chevauchent, sinon vous devrez revenir en arrière et recommencer la correspondance ...
L'expression régulière classique peut être implémentée d'une manière qui est rapide en pratique mais qui a un comportement dans le pire des cas vraiment mauvais (le DFA standard) ou d'une manière qui a garanti un comportement dans le pire des cas raisonnable (en le conservant en tant que NFA). Le DFA standard peut être étendu pour prendre en charge de nombreux caractères et indicateurs correspondants supplémentaires, qui utilisent le fait qu'il s'agit essentiellement d'une recherche de suivi.
Des exemples de l'approche standard sont partout (par exemple intégrés à Perl). Il y a un exemple qui prétend un bon comportement dans le pire des cas à http://code.google.com/p/re2/ - en fait, c'est encore mieux que ce à quoi je m'attendais dans le pire des cas, donc ils peuvent ont trouvé une ou deux astuces supplémentaires.
Si cela vous intéresse ou si vous souhaitez écrire des programmes qui peuvent être créés pour verrouiller des entrées pathologiques solides, lisez http://swtch.com/~rsc/regexp/regexp1.html .