Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Expressions Régulières Ven 17 Mai 2013 - 10:38 | |
| Eh oui, vous n'en pouviez plus d'attendre depuis cette discrète annonce, les comptes twitter cassaient vos oreilles par leurs piaillements, vos amis vous harcelaient sur facebook pour savoir quand il sortirait... Le voici enfin : Anciennes versions : Liste des changements- Spoiler:
Version 0.4 : - Correction de l'exportation de RegExp_Last
- Correction des bugs des états supérieurs à 127 et des groupes dépassant le 127ème caractère
Mais c'est quoi les expressions régulières ?- Spoiler:
Aussi appelées expressions rationnelles et souvent abrégées regex ou regexp), les expressions régulières constituent un outil très puissant qui offre de nombreuses possibilités pour manier les chaînes de texte. Vous pourrez trouver pléthore de pages consacrées aux regexp sur Internet, malheureusement la plupart les présentent dans un langage de programmation en particulier (perl, php, javascript, ...). Il existe toutefois ce site anglophone qui propose une approche générale de cet outil. La page consacrée sur CommentÇaMarche (pour PHP) synthétise bien la grammaire des expressions régulières (voir plus bas les spécificités de l'implémentation sous AGS). Pourquoi je voudrais manipuler des chaînes de texte de façon complexe dans un jeu AGS ?- Spoiler:
Je pense que vous n'en aurez probablement pas l'occasion en effet. Mais si vous ne connaissez pas encore les expressions régulières, ce module peut être une bonne occasion pour les plus programmeurs d'entre vous de découvrir cet outil incontournable dans le monde de la programmation. Un exemple ?- Spoiler:
Imaginez que par pure folie, vous vouliez intervertir une lettre sur deux dans une chaîne de caractères, comme ça : "abcdefg > badcfeg". Vous pourriez faire un petit algorithme un peu complexe, mais les expressions régulières peuvent s'en charger pour vous de façon très simple ! Avec ce module, sous AGS ça prendra la forme suivante : - Code:
-
String texte = "abcdefg"; Display("Folie : %s", texte.RegExp_Replace("(.)(.)","\\2\\1"); Ouais, c'est marrant, mais c'est limité. T'as pas plus complexe ?- Spoiler:
Imaginez que vous ayez stocké des données dans une chaîne de texte, sous la forme suivante : - Données a écrit:
- X = 5, Y = 10, Phrase = 'Salut \'bro\', comment tu vas ?', Nom = 'Roger'
Maintenant, vous voulez récupérer les données contenues dans cette chaîne de texte. Par exemple, vous voulez récupérer la phrase. Comment allez-vous faire ? - Vous pourriez regarder ce qui se trouve entre "Phrase" et la prochaine virgule dans cette ligne, seulement vous voyez qu'il y a une virgule dans la phrase elle-même et donc ça ne marchera pas.
- Vous pourriez vouloir vous baser sur les guillemets, mais la phrase aussi contient des guillemets (lesquels sont échappés ici) !
C'est là que les expressions régulières vont vous être d'une grande aide. Avec elles, vous pouvez dire "récupère ce qui se trouve entre guillemets après Phrase jusqu'à la prochaine virgule ou bien la fin suivant le guillemet qui n'est pas entre guillemets, et ne considère que les guillemets qui ne sont pas précédés d'un caractère d'échappement"... en une seule ligne ! Sous AGS avec ce module, ça donnera ça : - Code:
-
// Notez le redoublement des \ pour l'échappement sous AGS String donnees = "X = 5, Y = 10, Phrase = 'Salut \\'bro\\', comment tu vas ?', Nom = 'Roger'"; donnees.RegExp_Match("Phrase = '((?:(?:\\\\\\\\)*\\\\'|[^'])+)'(,|$)"); Display("La phrase : %s", LastRegexp.match[1]); Utilisation- Spoiler:
Ce module propose trois méthodes différentes : - Match vérifie si un texte correspond à un modèle.
- Count retourne le nombre de fois que le modèle peut être appliqué successivement au texte.
- Replace retourne une copie du texte dans laquelle soit la première soit toute occurrence du modèle (selon vos paramètres) a été remplacée par un texte de substitution.
Il y a trois façons d'utiliser ces méthodes : - Sur une instance RegExp.
- De façon statique directement sur le type RegExp
- Directement sur une chaîne de caractères.
Après avoir utilisé une de ces méthodes, vous pouvez récupérer le texte de vos groupes capturés en utilisant la propriété tableau match sur votre instance RegExp ; et le numéro du caractère dans le texte débutant chaque groupe en utilisant la propriété tableau match_start. Le groupe 0 correspond au à la correspondance du modèle tout entier. Si vous avez utilisé les méthodes de façon statique ou directement sur une chaîne, c'est l'instance globale RexExp_Last qui est utilisée. Exemples : - Code:
-
String texte = "Du code <b>HTML</b> mon <b>ami</b> !", modele = "<b>(.+?)</b>"; RegExp html; // On peut créer une instance RegExp html.Pattern = modele; // Pour laquelle on définit un modèle // Les trois instructions suivantes auront le même effet if (html.Match(texte)) Display("C'est du code %s", html.match[1]); if (RegExp.MatchText(texte, modele)) Display("C'est du code %s", RegExp_Last.match[1]); if (texte.RegExp_Match(modele)) Display("C'est du code %s", RegExp_Last.match[1]); // Les trois instructions suivantes auront le même effet Display("> %s", html.Replace(texte, "<i>\\1</i>", eRepeat)); Display("> %s", RegExp.ReplaceText(texte, modele, "<i>\\1</i>", eRepeat)); Display("> %s", texte.RegExp_Replace(modele, "<i>\\1</i>", eRepeat)); Spécificités et limitations de ce module- Spoiler:
- Ce module a actuellement une limite de 253 états, c'est-à-dire que en gros votre modèle ne doit pas dépasser 253 caractères (pensez à utiliser les + et les {M, N}, mais 253 c'est déjà pas mal, ça fait abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyzabcdefghijklmn)
- Le calcul se fait en deux fois : d'abord un automate à états finis est créé d'après le modèle passé, ensuite le texte testé est passé à l'automate. Optimisez donc votre code en ne créant l'automate qu'une seule fois si vous devez faire plusieurs tests du même modèle : créez une instance RegExp et définissez sa propriété Pattern une fois pour toute.
- Ce module n'implémente pas les [:classes:] de caractères, mais gère les caractères spéciaux (voir ci-après)
- Les caractères spéciaux implémentés dans ce module sont :
- \d : capture tout chiffre (équivaut à [0-9])
- \s : capture un espace simple
- \w : capture un caractère de mot (équivaut à [A-Za-z0-9])
- \D : capture tout sauf un chiffre
- \S : capture tout sauf un espace
- \W : capture tout sauf un caractère de mot
Les caractères spéciaux incluant (minuscules) sont utilisables dans les classes (ex: [+-_\d]) mais pas les excluant (majuscules). - Les masques récursifs (?R) ne sont pas (encore) implémentés.
- Il n'est pas possible de passer les groupes capturés comme arguments à des fonctions dans Replace (puisqu'on ne peut pas pointer vers une fonction dans AGS)
- Les assertions de type (?=), (?!=), (?<) et (?!<) ne sont pas (encore ?) implémentés.
_________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Dernière édition par Kitai le Dim 19 Mai 2013 - 10:07, édité 7 fois |
|
Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: Expressions Régulières Ven 17 Mai 2013 - 12:59 | |
| (c) xkcd(Existe également en T-shirt) Bravo Kitai ! Un pas de plus vers la réalisation d'un traitement de texte avec AGS ? Je suppose que ce module peut-être utilisé avec celui là (mais il faut que je creuse un peu plus pour être sur). Sinon, un petit manuel / tutoriel sur les obscures symboles permettant une recherche d'expression me serai très utile pour maitriser ce module, parce que là, je suis un poil perdu. |
|
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Expressions Régulières Ven 17 Mai 2013 - 18:55 | |
| - Billbis a écrit:
- Un pas de plus vers la réalisation d'un traitement de texte avec AGS ?
Je suppose que ce module peut-être utilisé avec celui là (mais il faut que je creuse un peu plus pour être sur). Je réalise en effet que j'ai fait pas mal de modules qui ont rapport avec le texte, surtout si on ajoute le module Bloc-Notes ! Ça pourrait en effet être quelque chose d'amusant de proposer une véritable ébauche d'éditeur de texte sous AGS Mais il me reste encore à standardiser le format PDF de sortie et à corriger les bugs du module Bloc-Notes. Note : En fait ce n'est pas très pertinent d'utiliser les expressions régulières avec le module FichiersParam, qui se charge déjà de stocker chaque paramètre de façon indépendante. - Billbis a écrit:
- Sinon, un petit manuel / tutoriel sur les obscures symboles permettant une recherche d'expression me serai très utile pour maitriser ce module, parce que là, je suis un poil perdu.
C'est aussi pour ça que j'ai mis le lien du tutoriel anglais, mais quelque part c'est sûrement pas le plus synthétique des documents. J'ai fait la présentation du module très rapidement (après avoir passé des semaines sur ce module, pas fâché d'avoir une version pré-finale ), mais j'essaierai de la reprendre histoire que ce soit plus compréhensible. _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: Expressions Régulières Sam 18 Mai 2013 - 15:28 | |
| J'ai chargé ton module (0.3), et essayé ce compiler : - AGS error a écrit:
- RegExp0.3.asc(817): Error (line 817): cannot export undefined symbol 'Regexp_Last'
C'est un test pour savoir si quelqu'un essaye vraiment le module ? EDIT : (a priori, c'est une faute de frappe Regexp_Last -> RegExp_Last) |
|
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Expressions Régulières Sam 18 Mai 2013 - 16:58 | |
| - Billbis a écrit:
- C'est un test pour savoir si quelqu'un essaye vraiment le module ?
Tu m'as démasqué Je me suis rendu compte de ce problème tout à l'heure moi aussi. Pour le moment j'essaie de résoudre un autre problème auquel je n'avais pas pensé. Mais merci pour le rapport, et n'hésite pas mettre les mains dans le cambouis des expressions régulières ! EDIT : coquille corrigée, j'ai aussi apparemment résolu le problème dont je parlais. _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
Asraroth Disciple de la Grande Tasse Bleue
Nombre de messages : 1468
Age : 49
Date d'inscription : 20/10/2006
| Sujet: Re: Expressions Régulières Jeu 23 Mai 2013 - 20:18 | |
| Quand un collègue vient me voir pour avoir de l'aide sur une regex : Quand ma regex retourne exactement ce que j'attends : Tiré de ce site... http://www.topito.com/best-of |
|
Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: Expressions Régulières Ven 24 Mai 2013 - 8:00 | |
| Quand Asraroth poste sur le forum après 15 mois de silence : |
|
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Expressions Régulières Ven 24 Mai 2013 - 8:36 | |
| Heureux de te lire Asraroth Petit message pour préciser qu'il existe un bug sur la version actuellement en ligne : un modèle comme "a(b?)+c" fera planter (boucle infinie). J'ai d'ores et déjà corrigé ce bug de mon côté, mais je songe à implémenter la récursivité avant. _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
Contenu sponsorisé
| Sujet: Re: Expressions Régulières | |
| |
|