Comment apprenez-vous les expressions régulières? [fermé]


80

Je ne demande pas 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.


2
En quelque sorte sur le sujet - regular-expressions.info . Utilisez cette suggestion et la suggestion de @ Jalayn ci-dessous. Apprendre en faisant!
Freiheit

6
gskinner.com/RegExr est le meilleur outil que j'ai trouvé pour développer les regex.
Callum Rogers

Un peu à la fois. Commencez par les éléments simples ("aaa", "aa.", "A * b", etc.) et progressez jusqu'à des composants spécifiques à la mise en oeuvre (par exemple, PCRE). Puis créez un motif et essayez de créer une expression rationnelle qui lui correspond.
tylerl

J'ai appris par essais et erreurs avec l'excellent programme RegexBuddy. regexbuddy.com (je n'ai aucun crédit pour cette publicité, ce programme m'a vraiment facilité la tâche)
Yam Marcovic

rubular.com est un bon outil pour développer des expressions rationnelles.
Gazler

Réponses:


68

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:

  1. 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)

  2. 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?


Commentaires: si vous souhaitez discuter des points les plus fins de cette question, utilisez le chat . Sinon, veuillez laisser une réponse ou voter sur les réponses qui vous semblent les plus correctes.

Merci pour l'édition. Cela rend cette réponse bien plus proche de la vérité. Bien que je ne pense toujours pas que vous ayez réellement besoin de connaître la théorie des automates (je ne le sais pas, mais je peux encore écrire des expressions régulières complexes), je conviens cependant que certaines connaissances de la théorie peuvent être utiles. Savoir en particulier comment le retour en arrière fonctionne et qu’il est contrôlé par des quantificateurs gloutons / peu scrupuleux / possessifs peut vraiment vous aider à mieux comprendre.
NikiC

Juste mes 2 centimes: dans une récente série de vidéos sur la bibliothèque regex C ++ STL dans Channel 9 de MSDN, le présentateur, qui est également le responsable de la maintenance de STL, a déclaré qu'ils l'implémentaient en tant qu'automate. Donc, connaître cette théorie devrait vraiment donner au PO quelques indications sur le fonctionnement de regex.
Korbes

5
Je ne suis pas du tout d'accord avec la déclaration liminaire. Quand j'ai appris les expressions régulières, je ne savais rien de la théorie des automates. Trois décennies plus tard, je ne le fais toujours pas. Ce que je savais, c’était comment lire une page de manuel, la prendre à la lettre, et comment expérimenter rapidement.
Bryan Oakley

1
@ Bryan bien ... Votre expérience kindof prouve le point. Vous savez peut-être comment l' utiliser , mais vous ne comprenez pas vraiment comment cela fonctionne. Si vous le faites, alors vous savez quelque chose à propos de la théorie des automates, même si vous ne savez pas le nommer. Mais vous ne pouvez pas comprendre complètement les expressions régulières sans connaître la théorie des automates, et aucune lecture de pages de manuel ne peut vous aider (sauf si vous lisez des pages de manuel expliquant la théorie des automates, bien sûr).
littleadv

36

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.


15
L'analyse HTML avec des expressions régulières est généralement une mauvaise idée.
Maxpm

10
Bien sûr que c'est une mauvaise idée. Utiliser des analyseurs syntaxiques DOM / Sax ou d’autres lecteurs XML dédiés est ce qui doit être utilisé "en général". Mais le sujet ici concerne l’apprentissage des expressions régulières, et j’ai partagé la façon dont j’ai appris sur les expressions régulières de manière que je pensais être "amusante".
Jalayn

3
Utiliser des analyseurs syntaxiques XML pour les pages Web HTML est une idée encore pire que de les gratter avec des expressions régulières.
Skolima

8
Ah bon, je voulais être plus précis sur ce que je pensais à ce sujet mais j'étais paresseux et j'ai juste réagi au commentaire ... Je pense que nous pouvons tous convenir que 1. utiliser des expressions régulières pour analyser le document entier est une mauvaise idée 2. Utiliser des analyseurs syntaxiques XML pour analyser HTML est une mauvaise idée. 3. Utiliser des analyseurs syntaxiques XML pour analyser XHTML est correct. Ou je peux simplement résumer: le bon outil pour le bon travail ...
Jalayn

23

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.


2
Cela devrait être la réponse définitive.
slim

1
+100,000 Un des meilleurs ouvrages techniques de tous les temps et de manière pratique sur le sujet de la question.
Affe

J'ai adoré ce livre. Le point clé étant que cela m'a aidé à comprendre toutes les fonctionnalités disponibles dans Regex. Vous ne pourrez pas mémoriser toute la syntaxe de la lecture d'un livre, mais celui-ci vous montrera tout ce qui existe pour que vous sachiez quels outils vous avez pour résoudre un problème lorsqu'il se présente.
Kibbee

Absolument +1 pour cette réponse. Je me suis sauvé à la regex jusqu'à ce que je me sois enfin assis et que je lise ce volume essentiel ligne par ligne. Maintenant, Friedl m'a donné suffisamment de fondements pour que je puisse raisonner à travers toutes les variations non standard qui nous tourmentent aujourd'hui! Je recommande fortement cette référence au PO et à tous les autres. +1 à @slim pour son commentaire, aussi!
John Tobler

19

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.

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.


+1 parce que vous abordez plusieurs choses qu'il est bon de savoir lorsque vous utilisez des expressions rationnelles; Je ne suis cependant pas d'accord sur votre opinion selon laquelle il n'est pas nécessaire de connaître les entrailles. Pour le forage, vous avez tout à fait raison. en informatique, j’ai vite constaté que je devais comprendre quelque chose de l’intérieur pour maîtriser son application, qu’il s’agisse de C ++ (compilateurs), de serveurs Web (HTTP) ou de regexes (théorie des automates). . Pas au point de devenir un expert, mais une bonne compréhension des principes sous-jacents est souvent le moyen le plus rapide d'apprendre.
Felix Dombek

3
@Felix: Je pense que nous sommes vraiment d'accord. J'ai dit que pour les applications débutantes, il n'est généralement pas nécessaire de comprendre le fonctionnement d'un outil pour l'utiliser. Ces mots trompeurs étaient délibérés. Pour un compagnon ou un maître dans l' utilisation d'un outil, il est très utile de comprendre au moins quelque chose sur ses composants internes, de sorte que vous puissiez prédire avec précision où l'outil aura de mauvaises performances, par exemple.
Eric Lippert

Hmm, je suis un peu en désaccord. Certains des programmes d’affaires les plus utiles que j’ai construits ont utilisé la théorie que j’ai apprise dans Lex et Yacc pour résoudre efficacement les problèmes. Vous avez cependant raison, une compréhension complète du niveau de doctorat n'est pas nécessaire. Je vais devoir lire les articles du blog, ils ont l’air le plus intéressant.
Spencer Rathbun le

Vous dites que les expressions régulières ne sont pas des expressions régulières - mais je pensais que l'expression "monde habituel dans le nom" faisait référence aux expressions "[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.
configurateur

1
@configurator: Un langage "normal" est par définition un langage qui peut être reconnu par un automate fini. Toute langue régulière peut être caractérisée par une "expression régulière" composée uniquement d'unions, d'alternatives, de caténations et de l'étoile Kleene. Mais la plupart des moteurs "d'expression régulière" reconnaissent de nos jours des langages plus complexes que les langages normaux; Par exemple, le langage des "phrases avec des parenthèses correctement appariées" n'est pas standard, mais vous pouvez le faire correspondre à une "expression régulière" dans certains moteurs d'expressions rationnelles.
Eric Lippert

6

Comment diable puis-je les aborder?

Comme toute nouvelle chose:

10 Study
20 Practice
30 goto 10

É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:

if ( 'foo' == 'bar' ) doSomething();

Cet exemple est nul parce qu'il ne sera jamais faire quoi que ce soit

if ( foo == 'bar' ) doSomething();

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:

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

Merveilleux, les utilisateurs peuvent maintenant entrer baret 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é BRA100 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 correspondre something == 'color'? Maintenant, vous devrez faire correspondre something == '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é à:

/colou?r/.test( something )

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:

string.match( regex )
regex.exec( string )
regex.test( string )

Commençant par quelque chose de simple comme:

javascript:'color'.match(/colou?r/);

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.


+1 pour recommander de jouer avec JavaScript dans le navigateur.
John Tobler

5

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.


Le "processeur de regex" mentionné n’implémente pas les disjonctions, et avec l’approche donnée, il est très difficile de les ajouter. J'aime le livre, mais c'est une chose qui m'a déçu.
Felix Dombek

4

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.


1
+1, "Regex Hero" est aussi gentil: regexhero.net/tester
Angelo

Regexbuddy est l'un de mes outils préférés. Voir l'arborescence est extrêmement utile, tout comme le fait de pouvoir tester instantanément lorsque vous générez votre regex. J'ai appris beaucoup plus de regex sans essayer de l'apprendre simplement en l'utilisant.
Chao

1
J'ai toujours trouvé RegexBuddy intéressant, mais je n'aime pas avoir à l'acheter. Pour les tests de regex de base, il existe de nombreux autres utilitaires. Pour voir une description textuelle de l'expression régulière bien qu'il y ait moins d'outils. La version payante de Regex Hero le fait aussi. Cependant, RegexBuddy est unique en son genre, le débogueur Regex, qui montre chaque acceptation ou rejet d’un personnage, et chaque retour en arrière dans des détails insoutenables, ce qui peut vraiment aider lors du débogage d’une regex volumineuse et très compliquée. Je n'ai pas remarqué d'autre outil qui fait ça.
Kevin Cathcart le

3

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.


3

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.

  1. 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à.

  2. 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.


1
Merci pour le tuyau sur Expresso. Je l'ai essayé et c'est génial!
Jim In Texas

3

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:

  1. : set incsearch ... Lorsque vous tapez un motif de recherche sur la ligne de commande, l'éditeur passe à la volée au premier morceau de texte qui correspond et met en surbrillance ce qui correspond. Si vous tapez quelque chose qui ne correspond plus à rien, Vim ramène votre curseur à l'endroit où vous étiez lorsque vous avez commencé.
  2. : set hlsearch ... ceci indique à Vim d'afficher un arrière-plan en surbrillance sur tout le texte correspondant à la recherche RE actuelle.

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.


RegExCoach est maintenant un shareware. Je l'ai trouvé très utile pour développer des ER complexes de style Perl.
Firstrock

2

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.


2

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.



1

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-regexpcommande. 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.


1

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.


1

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:

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

pour correspondre à la minute:

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

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.


1

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

  • grandes compétences et connaissances sur les expressions régulières
  • bonnes compétences avec sed
  • aider beaucoup de projets open source
  • obtenir beaucoup d'activités de contribution affichées sur mon profil github
  • un autre bon outil de «couteau suisse» pour la ceinture virtuelle

et a été aidé dans cette approche par la nécessité de

  • atteindre les objectifs actuels sans tricher
  • utiliser les compétences (regex) dans le cadre d'un objectif plus grand avec une plus grande motivation.
  • être capable de montrer la preuve des compétences que j'ai acquises en changeant le code des autres et en faisant ensuite réviser les changements.

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:


0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.