Je ne demande pas où apprendre. J'ai trouvé beaucoup de bonnes ressources en ligne, des livres, etc.
Mais comment diable je les aborde. Où est le début, la fin? Quand le processeur regexp avance-t-il sur le texte, quand se tient-il debout et tente-t-il une autre correspondance? etc.
J'ai envie d'essayer de comprendre les hiéroglyphes sur les pyramides égyptiennes.
learning
regular-expressions
dumbBoy
la source
la source
Réponses:
Je pense que la connaissance de la théorie des automates est essentielle à la compréhension.
Une fois que vous avez compris ce qu'est un automate et comment sont définis les langages réguliers, il sera beaucoup plus facile de comprendre les expressions régulières .
En ce qui concerne la syntaxe spécifique et les différences entre les différentes implémentations ... Eh bien, il y a certaines choses que vous devez simplement vous rappeler. Il existe des aides pour cela aussi.
Modifier
Certains des commentaires ci-dessous ont soulevé des points importants:
N'oubliez pas que les expressions régulières (telles qu'elles sont implémentées dans la plupart des langages de programmation) constituent un sur-ensemble d'expressions régulières en théorie des automates. Si un bon bagage théorique est un bon point de départ, il ne vous dira pas tout. (Merci, David Thornley)
Plusieurs commentateurs disent qu'il est possible d'apprendre les différentes syntaxes de regex sans apprendre les bases théoriques. Il est vrai que vous pouvez apprendre la syntaxe sans comprendre parfaitement son fonctionnement, mais j’ai eu l’impression que la compréhension complète correspond à ce que le PO était après. La question portait sur la base réelle: quand le processeur avance-t-il? Quand ça s'arrête? Comment décide-t-il que c'est un match? C'est la base, c'est la théorie, et elle est basée sur la théorie des automates. Bien sûr, vous pouvez conduire une voiture sans savoir comment fonctionne le moteur. Mais si on vous demande "comment l'essence le fait-il réellement conduire" - vous devez parler de la construction du moteur, n'est-ce pas?
la source
En pratiquant.
J'ai appris en m'amusant avec le raclage Web. Je suis sûr que je n'étais pas seul à faire ça juste pour m'amuser.
Un exemple: écrivez un code qui récupère les derniers scores de football, tennis (le sport que vous aimez en fait) sur votre site Web sportif préféré. Faites-le en écrivant du code pour charger la page, extrayez les partitions avec des expressions régulières et exportez-les dans la console ou dans un fichier texte. Assurez-vous qu'avec l'expression régulière choisie, vous ne récupérez que les partitions, et rien d'autre. Parfois, cela peut être assez difficile :-)
Deuxième exemple: écrivez un code qui récupère l'image de votre webcomic préféré (j'aime beaucoup Sinfest par exemple) et le stocke quelque part sur votre disque dur. Utilisez uniquement des expressions régulières pour récupérer la balise "img" et son contenu. Vous pouvez également éventuellement récupérer son titre s'il est stocké quelque part.
la source
Je sais que vous ne demandez pas de ressources, mais maîtrisez les expressions régulières de Jeffrey EF Friedl, c’est ainsi que j’ai appris comment elles fonctionnent et comment les utiliser. Même après en être arrivé à en utiliser beaucoup pour analyser différentes choses, le premier chapitre m'apportait de nouvelles choses.
Vous voulez comprendre ces maudites expressions rationnelles? Lis ce livre.
la source
Je commencerais par clarifier vos objectifs , puis par définir votre style d'apprentissage .
Ce qui m'a frappé dans votre question, c'est que vous demandez "comment puis-je apprendre les expressions régulières?" et ensuite immédiatement avec la question "comment le moteur d'expression régulière fonctionne-t-il en interne?" Vous semblez insinuer que ces deux choses ont quelque chose à faire l'une avec l'autre, ce qui est révélateur. Peut-être êtes-vous une personne qui apprend comment quelque chose fonctionne en la décomposant ou en la construisant vous-même.
Pour les applications débutantes, il n'est généralement pas nécessaire de comprendre le fonctionnement d'un outil pour l'utiliser efficacement. Vous n'avez pas besoin de savoir comment fonctionne un moteur de perceuse pour percer du bois; vous devez comprendre comment utiliser l’exercice, et non comment créer un exercice.
Alors, quel est ton objectif? Souhaitez-vous apprendre à créer un moteur d’expression régulière? ou avez-vous l'intention d'apprendre à utiliser efficacement les expressions régulières pour résoudre les problèmes de votre entreprise? Atteindre ces différents objectifs nécessite probablement différentes techniques d'apprentissage.
Pour répondre à votre question spécifique sur le fonctionnement du moteur d’expression régulière: cela dépend. L'approche théorique "classique" des expressions régulières consiste à utiliser l'expression régulière comme modèle pour un automate fini non déterministe, puis à construire l'automate fini déterministe équivalent, puis à exécuter cet automate contre l'entrée.
Presque personne ne le fait réellement pour plusieurs raisons. Premièrement, le nombre d'états multiplié par le nombre de caractères d'entrée possibles donne une table de transition d'état qui est vraiment énorme, même pour de petites expressions régulières. Bien sûr, la plupart de ces éléments peuvent être compressés, mais néanmoins, il y a beaucoup de règles de transition. Deuxièmement, les autres approches sont généralement plus rapides. Troisièmement, les expressions dites «régulières» se trouvent dans les bibliothèques d’expression rationnelle modernes, rien de tout cela. Ce ne sont pas du tout des langues régulières ; ils sont souvent reconnus par les automates à pile, et non par les langages d'automates finis.
(J'ai commencé à écrire une longue série sur le fonctionnement de tout cela, mais je me suis essoufflé après seulement les douze premiers articles . Vous les trouverez peut-être intéressants si vous souhaitez un bref aperçu du contexte théorique des expressions rationnelles de base.)
Les véritables moteurs d’expression régulière utilisent généralement une stratégie de retour en arrière. Le moteur d'expressions régulières que nous avons créé pour le moteur JScript il y a plus de dix ans compile maintenant l'expression régulière dans un langage de bytecode qui inclut des primitives pour la reconnaissance de séquences et le retour en arrière à des états antérieurs. Nous avons ensuite construit un interpréteur pour cette langue de code-octet.
Je n’essaierais pas de comprendre le fonctionnement d’un moteur d’ expression régulière avant d’avoir une compréhension assez solide de l’ utilisation des expressions régulières. Concentrez-vous sur cela avant de commencer à creuser dans les stratégies d'optimisation des différents moteurs.
la source
"[0-9]{3}"
auxquelles elle correspond - par exemple l'expression régulière qui peut correspondre à tout nombre à trois chiffres, et le nombre à trois chiffres 480 est un exemple pour une expression régulière. expressions il correspond.Comme toute nouvelle chose:
Étude
Je trouve que les enseignants les plus performants commencent à enseigner n’importe quel sujet en fournissant d’abord un peu d’arrière-plan. Il est important d’avoir un contexte de ce que vous apprenez et, plus important encore, pourquoi vous l’apprenez.
C'est tout correspondance de chaîne
Les expressions régulières sont un moyen de faire correspondre les modèles dans le texte. C'est un langage déclaratif lui-même intégré à de nombreux autres langages de programmation.
Je voudrais souligner que c'est un langage déclaratif, les expressions régulières sont utiles pour exprimer ce que la chaîne de match, mais ils n'exprime en aucune manière comment le programme est d'aller à faire la mise en correspondance. Pour cette raison, il est possible d'utiliser des expressions régulières très rapidement et très lentement dans le même langage de programmation en utilisant simplement un analyseur syntaxique différent.
La raison de la création d'expressions régulières est la même pour la création de la plupart des langages de programmation: les programmeurs se sont retrouvés à exécuter la même tâche compliquée encore et encore et ont décidé qu'ils souhaitaient une manière plus simple d'écrire le code.
Certains vont (et devraient) se plaindre de ma phrase précédente en disant quelque chose comme:
RegEx ne rend pas un programme plus simple.
c'est vrai
RegEx ne simplifie pas un programme, RegEx simplifie son écriture . Vous devez toujours faire des tests approfondis pour vous assurer que tous les cas corrects correspondent correctement et que tous les cas incorrects ne le sont pas. C'est vraiment difficile de tester "tout", et avec des modèles compliqués, c'est vraiment difficile de tester "la plupart". Dans le pire des cas, vous devriez toujours tester "certains" cas.
incorporons quelques exemples J'ai obligatoirement choisi le moteur RegEx de JavaScript car je peux le tester en direct dans le navigateur et parce que je n'aurai pas à échapper de chaîne en utilisant des littéraux RegEx.
Lorsque vous effectuez une correspondance de chaîne normale, vous testez une valeur de chaîne par rapport à une autre. Ils peuvent venir de n’importe où, mais au final, il faut comparer deux chaînes:
Cet exemple est nul parce qu'il ne sera jamais faire quoi que ce soit
Beaucoup mieux; maintenant, nous ne savons pas à l'avance si quelque chose sera fait ou non. Nous pouvons maintenant commencer à accepter les entrées de l'utilisateur:
Merveilleux, les utilisateurs peuvent maintenant entrer
bar
et quelque chose va se passer, jusqu'à ce que vous obteniez des rapports de bugs indiquant que cela"bar"
ne fonctionne pas, ou que "BAR" ne fonctionne pas, ou qu'ils ont tapéBRA
100 fois sans que rien ne se passe.En ignorant les fautes d'orthographe et les caractères supplémentaires, les
'bar' != 'BAR'
programmeurs doivent trouver un moyen de rechercher les cas où les caractères sont incorrects.Solution simple, utilisez
toLowerCase
. Cela fonctionne à merveille, mais qu'en est-il de nos utilisateurs qui utilisent l'anglais britannique par rapport à l'anglais américain quand vous leur faites correspondresomething == 'color'
? Maintenant, vous devrez faire correspondresomething == 'color' || somthing == 'colour'
.Longue histoire courte, les modèles simples se transforment très rapidement en beaucoup de code répétitif.
L’exemple de couleur peut simplement être associé à:
une solide compréhension des bases des expressions régulières peut réduire considérablement le temps que vous perdez à réinventer la roue.
Où étudier
La plupart des langues qui implémentent des expressions régulières ont au moins une ressource disponible pour la syntaxe spécifique consistant à utiliser des expressions régulières dans cette langue. Un pour JavaScript peut être trouvé sur MDN
lis le.
tout.
puis relisez-le.
Il faut du temps pour apprendre, considérez-le comme un investissement: une heure pour apprendre RegEx économise désormais une heure la prochaine fois que vous devez effectuer une recherche de motif de chaîne, puis une autre heure la prochaine fois.
Entraine toi
Après avoir tout lu sur RegEx, vous ne comprendrez probablement pas l'essentiel. C'est parce que vous ne faites rien avec cela.
J'ai mentionné pourquoi j'ai choisi JS pour cet exemple, je vous exhorte à le manipuler dans votre navigateur. C'est rapide et vous pouvez le faire directement dans votre barre d'URL.
JS a quelques façons simples et différentes d’utiliser RegEx:
Commençant par quelque chose de simple comme:
est un moyen facile de mettre un pied dans la porte. Jouez avec, casser le voir ce qui correspond, et ce qui ne fonctionne pas.
Continuez quand vous êtes coincé dans la pratique
30
. Vous devez lire pour en apprendre davantage, mais vous devez vous exercer pour bien comprendre ce que vous avez appris.la source
Brian Kernighan écrit un simple processeur d'enregistrement dans le livre Beautiful Code . Je réalise que vous ne recherchez pas de ressources, mais il serait peut-être utile de voir une implémentation de base , à l'intérieur.
la source
Dans le développement normal, le code de débogage peut fournir des informations très utiles. Les expressions régulières ne sont pas différentes. Donc, au risque de ressembler à une publicité, procurez-vous RegexBuddy . Il dispose d'un excellent outil pour afficher visuellement ce que fait le moteur lorsqu'il gère votre expression et la chaîne d'entrée.
la source
Les expressions régulières peuvent devenir très compliquées très rapidement, je vous recommande donc de commencer à l’apprentissage à l’aide de didacticiels. Sachez que la forme la plus simple d’expression régulière est une chaîne représentant ce que vous recherchez. Malheureusement, pour pouvoir définir des règles de recherche spéciales, certains caractères sont nécessaires. Vous devez les échapper, sinon vous créeriez une expression régulière non valide ou incorrecte.
Mon conseil est de commencer avec un exemple de quelque chose que vous recherchez et d'y échapper. En d'autres termes, si vous cherchez quelque chose entre parenthèses, prenons un exemple d'une telle chaîne dans le texte que vous recherchez:
(this is an example of something you'd want to find)
Commencez par échapper des caractères afin de rechercher le caractère littéral:
\(this is an example of something you'd want to find\)
Testez-le, vérifiez qu'il trouve votre exemple correctement. Puis généralisez l'expression pour rechercher un tel texte, pas seulement l'exemple que vous avez trouvé. Ainsi, il deviendrait alors:
\([^)]*\)
(signifie tout caractère qui n'est pas ")" pour un nombre quelconque d'occurrences, y compris 0).Testez-le à nouveau et vérifiez qu'il trouve non seulement votre exemple, mais qu'il en trouve d'autres. Recherchez des expressions régulières plus compliquées mais plus fréquentes sur Internet et corrigez-les avec vos expressions régulières existantes pour éviter de vous inquiéter de toutes les possibilités.
C'est à peu près ça. Et oh, apprendre et aimer \ Q ... \ E. Dans la plupart des langages d'expression régulière, \ Q indique le début d'un motif littéral et \ E marque la fin, au cas où vous auriez à chercher des motifs particulièrement sophistiqués sans savoir comment les échapper. Cela m'a sauvé la vie plus d'une fois.
la source
Je vais vous donner une réponse simple pour une question simple. Tout d’abord, vous devez comprendre ce que sont les expressions régulières (RegEx) - ce qu’elles font, à quoi elles servent. Ensuite, un excellent outil pour commencer.
Qu'Est-ce que c'est? RegEx est un langage pour exprimer une correspondance de modèle. En d’autres termes, en l’utilisant, vous pouvez créer une combinaison de caractères qui reconnaît ou trouve des modèles dans le texte. Comment est-ce utile? En programmation, vous pouvez indiquer aux ordinateurs de faire correspondre le texte provenant d'une source (une entrée utilisateur, une page Web, etc.) et détecter si des modèles de texte spécifiques y sont ou non contenus. Par exemple, un point (.) Représente n’importe quel caractère - lettre ou chiffre. Les chiffres entre accolades représentent des nombres d’itérations. Ainsi, ". {1,30}" indique n’importe quel caractère, répété entre 1 et 30 fois. En d’autres termes, vous ne pouvez pas avoir une chaîne vide et sa longueur ne doit pas dépasser 30. personnages. Et ça continue à partir de là.
Comment commencer à apprendre? Le meilleur outil que j'ai jamais vu est Expresso , mais ce n'est que pour Windows. Il possède une interface graphique très complète dans laquelle vous cliquez sur les éléments que vous souhaitez ajouter à votre expression, puis un testeur pour le comparer à différentes entrées afin de voir les résultats. Je n'ai rien vu de bien sur le Mac (mais j'utilise Windows sous VMWare, je n'ai donc pas vraiment besoin d'une version Mac), je n'ai pas passé beaucoup de temps à chercher sous Linux.
la source
En plus d’une bonne référence, vous apprenez réellement à utiliser de bons outils d’apprentissage. L’un utilise l’ éditeur open source Vim , avec deux options:
L'autre consiste à utiliser un outil gratuit appelé RegExCoach . Vous collez le texte que vous souhaitez rechercher, puis développez votre expression régulière dans une autre fenêtre. Comme Vim, il met en évidence les matchs réussis à la volée.
la source
Vous commencez avec une comparaison de chaîne de base. Très facile, mais pas aussi puissant.
Ensuite, il vous est peut-être venu à l'esprit que vous avez besoin de comparaisons sans distinction de casse, de sorte que "grec" et "GreeK" se comparent. C'est un peu plus puissant.
Un jour, vous remarquerez que de petites différences d’orthographe ne doivent pas empêcher deux mots de comparer égaux: c’est-à-dire "organiser" et "organiser" doivent être comparés. Vous vous asseyez et écrivez un code qui fait cela et vous êtes heureux.
Jusqu'à ce que vous absteniez un peu plus et que vous réalisiez que vous voulez parfois que tous les mots qui se terminent par "ize" se comparent avec leurs frères en orthographe britannique. Ou, répétition de certaines chaînes un certain nombre de fois. Et, bien sûr, vous devez combiner tout cela.
Etc. Enfin, il est fort probable que vous finissiez avec une notation où chaque caractère ne se représente pas. Rien d'autre n'est une expression rationnelle. On peut le voir comme une description d'un ensemble de chaînes.
Et puis, il est assez facile et se résume aux 3 principes de base suivants:
Vous avez des expressions rationnelles de base: les caractères qui les représentent, les classes de caractères, des abréviations pratiques et moins pratiques pour les classes de caractères telles que \ d ou \ p {Lu} pour les lettres majuscules.
Et puis, vous avez quelques possibilités pour les combiner: si r1 et r2 sont des expressions rationnelles, alors il en est de même de r1r2 r1 | r2 (r1).
Dernier point, mais non des moindres, les modificateurs de répétition: r? r * r + r {n, m}
C'est tout ce que vous devez savoir. Tout ce que vous pouvez rechercher quand vous en avez besoin.
la source
Deux autres bonnes réponses vous apprennent la théorie derrière les expressions rationnelles et la pratique, qui sont d'excellents conseils. Je vous recommanderais également de vous procurer un bon outil visuel de regex pour vous aider si vous êtes sérieux.
RegexBuddy , par exemple, dispose d'un mode de débogage visuel qui vous permet de suivre l'exécution d'une expression rationnelle et de vous montrer, par le biais de surlignages et d'un texte explicatif, ce que fait le moteur d'expression régulière à chaque étape. Il y a une vidéo démontrant ce débogage sur leur site.
la source
Tout ce que nous pouvons vous donner est plus de ressources à apprendre. Cette question est elle-même une ressource.
A propos, j'ai appris assez facilement les expressions régulières sur ce site: http://www.regular-expressions.info/
la source
Pour moi, voir à quoi correspond l'expression rationnelle au fur et à mesure que je la construis aide vraiment, me simplifie la vie et m'aide à mieux les comprendre.
Pour ce faire, je vais ouvrir un fichier avec le texte cible dans Emacs, puis utiliser la
isearch-forward-regexp
commande. Au fur et à mesure que vous entrez dans l'expression rationnelle, Emacs vous montre ce à quoi elle correspond (c'est la partie "isearch").Pour exécuter la commande, dans Emacs, vous pouvez utiliser
<ESC>xisearch-forward-regexp
.la source
J'ai appris les expressions régulières en apprenant flex et bison, qui sont utilisés pour construire des analyseurs et des analyseurs syntaxiques lexicaux. Vous ne pouvez pas avoir un analyseur syntaxique sans expressions régulières, et le livre lexx and yacc est incroyablement bon pour parcourir la théorie sans aller trop vite.
Fondamentalement, pratiquement tous les moteurs de regex de nos jours suivent les mêmes principes. Ce sont toutes des machines à états finis et si vous y tenez vraiment, vous avez une longueur d'avance sur presque tous les codes que vous écrivez. Cela ressemble à l'apprentissage de la récursion en ce sens qu'une fois que vous l'obtenez, vous l'appliquez instinctivement aux problèmes. Ils sont faciles à résoudre avec le bon outil, mais très difficiles sans lui.
Une autre chose à propos de l'apprentissage de Lexx et de Yacc, par rapport aux expressions régulières, est que vous apprenez comment elles fonctionnent en interne. Comment le programme se projette-t-il à l’avenir, pourquoi at-il terminé une correspondance, comment il conserve les données et bien plus Comprendre les indicateurs est un impératif absolu, mais si vous maîtrisez lexx et le yacc et que vous le parcourez depuis le début, vous apprendrez tout ce que vous avez demandé et aurez un outil extrêmement puissant pour le reste de votre carrière.
Cette question comprend un ensemble de ressources pour l’apprentissage et un squelette flexible que j’ai jeté ensemble.
la source
D'ailleurs, j'essaie d'abord de m'assurer qu'il n'y a pas de moyen plus facile de résoudre le problème / "tokenize" la chaîne.
Lorsque vous ne parvenez pas à en trouver un, je considère que le problème n’est pas d’essayer de faire correspondre ce que vous voulez en dehors de la chaîne, mais plutôt de ne PAS faire correspondre ce que vous ne voulez pas. C'est principalement parce que les regex sont gourmandes. Mais cela m’a bien servi comme approche pour obtenir ce que je veux.
Voici un exemple:
pour correspondre à la minute:
Au lieu d'essayer de trouver l'heure avec tout le reste, essayez de trouver les limites distinctes.
L'exemple est un peu artificiel, mais tout ce que je pourrais trouver.
la source
L’une des méthodes que j’avais utilisée consistait à rechercher un ensemble de projets open source nécessitant des mises à jour de la syntaxe, puis à écrire un script sed de plus en plus complexe, composé de nombreuses expressions régulières.
Le script devait être exécuté sur de nombreux fichiers différents dans chaque projet open source. Ensuite, lancez-vous contre de nombreux projets différents avec des styles différents. J'ai commencé avec quelque chose de très simple, comme par la
%s/before/after
suite, j'ai trouvé que cela correspondait à trop de cas. donc j'ai ajouté plus de choses pour empêcher cela. Ensuite, j'ai trouvé différents projets utilisant différents styles de syntaxe nécessitant des modifications différentes.Finalement, j'ai fini avec
et a été aidé dans cette approche par la nécessité de
Je vous transmettrai également qu'il existe de nombreux sites pour les différentes langues - ruby, javascript, etc., qui vous permettront de jouer avec des expressions et des exemples de texte pour une gratification immédiate. Ceux-ci sont:
regex en plusieurs langues sur un site
se concentrer sur les groupes de match:
la source
J'ai trouvé des expressions régulières similaires à celles des tables de multiplication: oui, vous devez comprendre les idées qui les sous-tendent, mais vous devez le faire souvent et à maintes reprises.
Lorsque j'apprenais, je me fixais comme objectif de faire quelques exercices de regex par jour. En pratique, cela signifiait au moins une fois par jour que j'essayais de regarder une chaîne ou un texte sur mon écran et de relever un défi: "puis-je obtenir toutes les adresses électroniques d'ici" ou "trouver tous les les occurrences du mot 'code' utilisé comme verbe plutôt que comme nom ", des choses comme ça.
Faire cela pendant quelques semaines a vraiment porté ses fruits - et bien sûr, des examens périodiques et des mises à jour sont nécessaires. Je suis sur le point pour un.
J'ai également trouvé cet outil en ligne utile car il m'a permis de tester regex en temps réel: http://www.gethifi.com/tools/regex
la source