Expressions Régulières

Slides:



Advertisements
Présentations similaires
Les Structures.
Advertisements

GEF 243B Programmation informatique appliquée
La sécurité des systèmes informatiques
Portée des variables VBA & Excel
DTD Sylvain Salvati
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Algorithmique Résume.
Vocabulaire pour la passage du modèle conceptuel des données au modèle relationnel des données. MCDMRD EntitéTable PropriétésChamps, attribut IdentifiantClé
Le publipostage La fonction de fusion permet de créer des documents identiques dans les grandes lignes que l’on personnalise automatiquement à chaque destinataires.
Système formel Nous avons introduit : signes de variables (x, y, z, …), de constantes (0, 1), d’opérations (+, ), de relations (=, ) Axiomes : ce sont.
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
La configuration Apache 2.2 Lhébergement virtuel.
Un peu de sécurité Modal Web Modal Baptiste DESPREZ
Monnier Cédric T SEN TR L.P. Denis Diderot Du 03 Janvier 2011 au 11 Février 2011 Computer Junction 72 Elm Grove P05 1LN Portsmouth (Angleterre)
Les requêtes La Requête est une méthode pour afficher les enregistrements qui répondent à des conditions spécifiques. La requête est donc un filtre.
Les bases de l’Algorithmique
IFT313 Introduction aux langages formels
Cours de programmation
1 Comment utiliser votre Extranet Se connecter 2.My Site 3.Documentation 3.1 Documents dintégration 3.2 Documents types 4.Vos informations privées.
Créer une animation simple Gif avec ImageReady.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
1 GPA435 Systèmes dexploitation et programmation de système Copyright, 2000 © Tony Wong, Ph.D. Chapitre 9 Filtre programmable nawk(1)
Expressions et assignations
Chapitre 7: Les polynômes
Initiation à la conception de systèmes d'information
Initiation aux bases de données et à la programmation événementielle
Les instructions PHP pour l'accès à une base de données MySql
28 novembre 2012 Grégory Petit
L’utilisation des bases de données
Introduction à la structuration des documents: les techniques M2: Gestion des connaissances.
XML: Syntaxe XML, DTD et Schémas
CHAINE DE CARACTERES : Définition :
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Manipulation de formulaires en Javascript
Expressions régulières et hash tables
Les Fonctions. Définir une fonction Sections de code indépendantes que lon peut appeler à nimporte quel moment et dans nimporte quel ordre. Bout de code.
Introduction à la programmation I Fonctions Structures de contrôle Structures de données (arrays simples et indexés) Variables locales et globales.
1 GPA435 Systèmes dexploitation et programmation de système Copyright, 2000 © Tony Wong, Ph.D. Chapitre 9 Programmation nawk(1)
GPA435, GPA – ÉTS, T. Wong Génie de la production automatisée GPA435 Système dexploitation et programmation de système Chapitre 6 Partie II 2014.
Chapitre 3: Les équations et les inéquations
Chapitre 1 Le Sens des nombres
Questions abordées Aujourd’hui Qu’est-ce qu’une expression régulière ?
Structure et Services « STS » Menu Structures : Divisions
1° A quoi correspondent chacune des expressions suivantes :
Initiation au web dynamique
1 GPA435 Systèmes d’exploitation et programmation de système Copyright, 2000 © Tony Wong, Ph.D. Chapitre 8 Filtres UNIX.
Le langage XHTML 420-S4W-GG Programmation Web Client
Comment introduire des données dans la base de données « recherche » des FUNDP © Collège des scientifiques - Faculté de Droit.
Paradigmes des Langages de Programmation
Menu Structure : Divisions Diffusion Nationale TOULOUSE – Décembre 2008 Structure et Services « STS » Menu Structures : Divisions.
Codage des nombres en informatique : le système binaire.
Modes d’adressage (1) Référence aux cellules dans les formules – Important lors des copier/coller Adressage relatif (dépend de la cellule d’origine) –
 Syntaxe du langage PHP
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
1 PHP 5 Notions fondamentales (niveau 1 cours #4) Formation continue – Cégep de Sainte-Foy.
Sélection de colonnes (la projection)
PHP 6° PARTIE : LES SESSIONS 1.Introduction 2.Identificateur de session 3.Variables de session 4.Client / Serveur 5.Principe 6.Ouverture de session 7.Enregistrement.
Module : Pages Web Dynamiques (Production Électronique Avancée)
1 PHP 5 Notions fondamentales (niveau 1 cours #4) Formation continue – Cégep de Sainte-Foy.
Introduction au langage C Les entrées-sorties
Mettre en formeExaminerManipuler Les fonctions printf() et sprintf Le traitement de chaîne de caractère La fonction printf() formate le contenu d'une chaîne.
Initiation au JavaScript
Introduction à l’utilisation des corpus Introduction aux expressions régulières.
eXtensible Markup Language. Généralités sur le XML.
GPA435 Systèmes d’exploitation et programmation de système Copyright, 2000 © Tony Wong, Ph.D. Chapitre 7 Neutralisation, redirection, décodage des paramètres,
Introduction à l’utilitaire
Philippe Gandy - 22 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Philippe Gandy – 10 novembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
APP-TSWD Apprentissage Par Problèmes Techniques des Sites Web Dynamiques Licence Professionnelle FNEPI Valérie Bellynck, Benjamin Brichet-Billet, Mazen.
Transcription de la présentation:

Expressions Régulières 5 à 7 Expressions Régulières Le 21 Janvier 2010

Expressions Régulières Plan Introduction Syntaxe Bases Caractères simples Caractères de limite Opérateurs logiques Capturer des groupes Classes de caractères Classes abrégées Quantificateurs Gourmands Réticents Possessifs Drapeaux Exemples Exercices A reconnaître A construire Utilisation Java PHP Perl Javascript Eclipse Notepad++ Vi Conclusion Bibliographie

Introduction Principes

Introduction Principes Qu’est-ce qu’une expression régulière ou REGEX ? C’est une chaîne de caractères qui permet de décrire un modèle (ou pattern) de chaîne de caractères. Ce modèle est décrit à l’aide d’opérateurs, de valeurs et de variables. Des options sont disponibles pour simplifier l’écriture de la REGEX. A quoi sert une REGEX ? MATCH: A vérifier qu’une chaîne de caractères vérifie un pattern donné : la REGEX Est-ce que ma chaîne commence / finit par … ? Est-ce que ma chaîne contient / ne contient pas … ? Est-ce que ma chaîne a la syntaxe d’une adresse e-mail / web ? EXTRACT: A extraire une partie d’une chaîne de caractère (= un groupe) Je veux les paramètres param1 et param3 de l’URL … Parsing d’une page web SUBSTITUTE: A remplacer une partie d’une chaîne de caractères par une autre Modifier massivement le format d’un fichier CSV, SQL … Quels outils utilisent les REGEX ? La plupart des langages de programmation (Java, PHP, Perl, Javascript, …) La plupart des éditeurs de textes (Eclipse, Notepad++, vi, …)

Syntaxe Comment ça s’écrit ?

Syntaxe Bases Caractères simples Caractères de limite x satisfait le caractère x \t satisfait le caractère « tabulation » \n satisfait le caractère « nouvelle ligne » \r satisfait le caractère « retour charriot » \f satisfait le caractère « saut de page » \e satisfait le caractère « échappement » Caractères de limite ^ caractérise le début de la ligne $ caractérise la fin de la ligne \b caractérise une coupure de mot (des caractères au début ou à la fin d’un mot) \beur satisfait eurelis mais pas agitateur (mot qui commence par eur) eur\b satisfait agitateur mais pas eurelis (mot qui finit par eur) \B caractérise les caractères à l’intérieur d’un mot (ni au début, ni à la fin) \Bi satisfait git et ci (mot qui ne commence pas par i) i\B satisfait git mais pas ci (mot qui ne finit pas par i) Opérateurs logiques XY satisfait le caractère X suivi du caractère Y X|Y satisfait le caractère X ou le caractère Y X(?!Y) satisfait une chaîne contenant X non-suivi de Y (sans capturer Y)

Syntaxe Capturer des groupes Un groupe permet de définir un sous-motif dans une expression régulière capturer le caractère X : (X) récupérer le nième groupe capturé en référence arrière (dans la regex): \n en substitution (hors de la regex): $n Références arrières \n correspond au nième groupe capturé précédemment Exemple: <(b|i)>text</\1> satisfait <b>text</b> et <i>text</i> ne satisfait ni <b>text</i> ni <i>text</b> Toujours suivre l’ordre des parenthèses Exemple: (anti)((con)sti(tu)tion)n(elle(ment)) Le groupe 0 contient anticonstitutionnellement Le groupe 1 contient anti Le groupe 2 contient constitution Le groupe 3 contient con Le groupe 4 contient tu Le groupe 5 contient ellement Le groupe 6 contient ment Remarques Les quantificateurs nous obligent souvent à entourer de parenthèses et donc créer des groupes capturant pour signifier qu’il s’applique à un sous-motif: pour ne pas créer un groupe capturant, il faut écrire: (?:XY) Utiliser des groupes non-capturant est plus rapide Si à un sous-motif est capturé plusieurs fois, la valeur du groupe sera le dernier sous-motif

Syntaxe Classes de caractères (1/2) Classes simples Attention! [abc] satisfait a, b ou c. Equivalent à a|b|c Négation [^abc] satisfait tout sauf a, b ou c Intervalle [a-z] satisfait tous les caractères de a à z [A-Z0-9] satisfait tous les caractères de A à Z et de 0 à 9 Union [a-d[c-p]] est l’équivalent de [a-p] Intersection [b-p&&[a-d]] est l’équivalent de [b-d] Soustraction [a-z&&[^bc]] est l’équivalent de [ad-z] [a-z&&[^m-p]] est l’équivalent de [a-lq-z] Attention! ^ est le début de la ligne quand il est au début de la regex ^ est une négation dans une classe de caractères [-a-z] satisfait tous les caractères de a à z et -

Syntaxe Classes de caractères (2/2) Classes abrégées Remarques . satisfait tous les caractères \d est un chiffre («digit»). Equivalent à [0-9] \D est un non-numérique. Equivalent à [^0-9] ou [^\d] \s est un espacement («whitespace»). Equivalent à [ \t\n\f\r] \S est un non-espacement. Equivalent à [^\s] \w est un alphanumérique (« word »). Equivalent à [a-zA-Z_0-9] \W est un non-alphanumérique. Equivalent à [^\w] Remarques . représente généralement tous les caractères mais pas le saut de ligne si la chaîne de caractères contient plusieurs lignes, il faudra spécifier (.|\n)* plutôt que .* Si on utilise un drapeau spécial (s - voir slide sur les drapeaux), le . indique qu’il contient le \n

Syntaxe Quantificateurs (1/2) Quantificateurs « gourmands » ou « avides » (greedy) : cherchent le nombre maximal de répétitions qui autorisent le succès de la recherche X? satisfait le caractère X, 0 ou 1 fois X* satisfait le caractère X, 0 ou plusieurs fois X+ satisfait le caractère X, 1 ou plusieurs fois. Equivalent à XX* X{n} satisfait le caractère X, exactement n fois X{n,} satisfait le caractère X, au moins n fois X{n,p} satisfait le caractère X, au moins n fois, mais pas plus de p fois Quantificateurs « réticents » ou « paresseux » (reluctant) : cherchent le nombre minimal de répétitions qui autorisent le succès de la recherche C’est l’exacte même syntaxe que les quantificateurs « gourmands » à laquelle on ajoute ? Quantificateurs « possessifs » (possessive): cherchent le nombre maximal de répétition mais sans assurer le succès de la recherche (sans regarder si la suite de l’expression est satisfaite dans la chaîne) C’est l’exacte même syntaxe que les quantificateurs « gourmands » à laquelle on ajoute + Remarque Les quantificateurs possessifs sont beaucoup plus rapides pour s’exécuter

Syntaxe Quantificateurs (2/2) Exemples: Si la chaîne est <a href="http://www.eurelis.com">Eurelis</a> Gourmand: <a href=(.*)> => la chaîne satisfait la regex le groupe 1 est "http://www.eurelis.com">Eurelis</a Réticent: <a href=(.*?)> => la chaîne satisfait la regex le groupe 1 est "http://www.eurelis.com" Possessif: <a href=(.*+)> => la chaîne ne satisfait pas la regex (.*+) commence par capturer "http://www.eurelis.com">Eurelis</a> et ne trouve pas de > après Si la chaîne est abcdaefag Gourmand: ^(.*)a([^a]+).*$ => la chaîne satisfait la regex le groupe 1 est abcdaef et le groupe 2 est g Réticent: ^(.*?)a([^a]+?).*$ => la chaîne satisfait la regex le groupe 1 est vide et le groupe 2 est b Possessif: ^(.*?)a([^a]++).*$ => la chaîne satisfait la regex le groupe 1 est vide et le groupe 2 est bcd

Syntaxe Drapeaux (flags) Les drapeaux sont les options de l’expression régulière c : au cas où une erreur survient, ne pas réinitialiser la position de la recherche g : rechercher globalement, c’est-à-dire trouver toutes les occurrences i : ignorer la casse m : multiple lines, la chaîne de caractères peut comporter plusieurs lignes o : once, n’appliquer le modèle de recherche qu’une seule fois s : single line, considérer la chaîne de caractères comme une ligne distincte x : extended, utiliser la syntaxe étendue Attention! Tous ces drapeaux ne sont pas disponibles dans tous les langages Les plus utilisés sont: g i m

A réutiliser dans vos développements Exemples A réutiliser dans vos développements

Exemples Quelques cas courants (1/2) Code Postal en France Règles: ce numéro comporte 5 chiffres Expression régulière: \b[0-9]{5}\b Numéro de téléphone en France ce numéro comporte 10 chiffres le premier chiffre est toujours un 0 le second chiffre va de 1 à 6 (1 pour la région parisienne... 6 pour les téléphones portables), mais il y a aussi le 8 (ce sont des numéros spéciaux) et le 9 (pour les lignes Free) ensuite viennent les 8 chiffres restants (ils peuvent aller de 0 à 9 sans problème) \b0[1-689]\d{8}\b Si on ajoute la règle: Les 10 chiffres peuvent ou non aller par groupes de 2 séparés d’un espace, d’un point ou d’un tiret On complète notre regex existante: \b0[1-689]([-. ]?\d{2}){4}\b

Exemples Quelques cas courants (2/3) Adresse E-mail Règles: login@domain Elle peut être en minuscule ou majuscule Il y a toujours 2 parties (l’identifiant et le domaine) séparées par un @ L’identifiant est composé de 1 ou plusieurs mots avec des ., -, % ou + Le domaine est composé de 2 parties séparées par un . La 1ère partie est un mot avec éventuellement un . ou un – mais sans _ La 2nde partie est composé de 2 à 4 lettres Expression régulière: \b[\w.%+-]+@[a-zA-Z\d.-]+\.[A-Za-z]{2,4}\b Remarques: Il existe une expression régulière officielle (standard RFC 2822) mais très compliquée: (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) On peut utiliser le flag « i » pour ignorer la casse (mais l’expression régulière tient déjà compte de cela sans le flag) Dans ce cas on peut simplifier l’expression régulière pour avoir: \b[\w.%+-]+@[a-z\d.-]+\.[a-z]{2,4}\b

Exemples Quelques cas courants (3/3) URL Adresse IP v4 Règles: protocol://(username:password@)?domain(:port)?/.* Elle est composée des parties suivantes: Un protocole alphanumérique sans _ suivi de :// Eventuellement un login et mot de passe séparés par deux points (:) et le tout suivi de @ Un domaine composé de 2 parties séparées par un . La 1ère partie est un mot avec éventuellement un . ou un – mais sans _ La 2nde partie est composé de 2 à 4 lettres Eventuellement un numéro de port précédé de deux points (:) Eventuellement un / suivi de n’importe quel caractère Expression régulière: \b[a-zA-Z\d]+://(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?\b Adresse IP v4 Règles: Elle est composé de 4 groupes de 1 à 3 chiffres, séparés par un . Chaque chiffre est compris entre 0 et 255. \b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}25[0-5]|(2[0-4]\d|[01]?\d{1,2})\b

Exercices Il faut bien pratiquer!

Exercices A reconnaître (1/2) A quoi correspondent ces expressions régulières ? [a-zA-Z_0-9]+ [0-9]* ?: Elle permet de trouver un mot suivi d’un espace lui-même suivi éventuellement d’un nombre, puis éventuellement d’un espace, et enfin du signe deux points comme dans « Exercice 1: ». On aurait pu aussi l’écrire: \w+ \d* ?: (?:\d{2}/){2}\d{4} Elle permet de trouver une date au format jj/mm/aaaa sans capturer de groupe \d{2}(-|/)\d{2}\1\d{4} Elle permet de trouver une date au format jj/mm/aaaa ou jj-mm-aaaa (\w+)\W+\1 Elle permet de trouver un mot répété comme dans « Agitateur de de technologies » <img\s+src="([^"]*?)" Elle permet de capturer dans $1 la source d’une image (?:https?|ftp)://[^/]+(/.*) Elle permet de capturer dans $1 l’URL absolue sans le nom de domaine

Exercices A construire (2/2) Trouver les expressions régulières qui permettent de: Vérifier que le login saisi contient bien entre 5 et 12 caractères alphanumériques (y compris -) ^[\w-]{5,12}$ Définir un décimal: un nombre, négatif ou positif, qui contient ou non un point ou une virgule pour séparateur des décimales, dont le 0 avant le point est facultatif si le décimal est entre 0 et 1 et le caractère + est facultatif ( exemples: +1.5 / -,34 / 0,5 / -2 / 1. contre-exemples: ++1 / ,1,2 / 4+ / .-3) ^[+-]?\d*[.,]?\d*$ qui accepte une chaîne vide ^[+-]?(?:\d+[.,]?\d*|\d*[.,]?\d+)$ qui n’accepte pas les chaînes vides Récupérer la valeur du paramètre param1 de l’URL dans un lien type href="…"   \?.*?param1=([^&"']*) Valider que la chaîne comporte 2 fois de suite un même nombre séparé par un signe d’opération mathématique (exemple: 5-6+6*2/3) (\d+)[-+*/]\1 Valider qu’une balise XML encadrant un texte est bien fermée et a au moins 2 attributs <(\w+)(?:\s+[^=]+=\S*){2,}>[^<]*</\1> Vérifier que le chemin est de la forme /default/main/…/…/…/WORKAREA/work mais qu’aucun des répertoires entre main et WORKAREA n’est config ou import ^/default/main/(?!config|import).*?/WORKAREA/work$

Mise en œuvre dans les outils de tous les jours… Utilisation Mise en œuvre dans les outils de tous les jours…

Utilisation des REGEX Mise en œuvre : JAVA Exemples

Utilisation des REGEX Mise en œuvre : PHP

Utilisation des REGEX Mise en œuvre : PERL Remarque Il faut déspécialiser les caractères s’ils correspondent au séparateur choisi Les séparateurs peuvent être n’importe quel caractère Ex: if ( $maChaine =~ m(regex)flags ) {…} if ( $maChaine =~ m/regex/flags ) {…} if ( $maChaine =~ m|regex|flags ) {…} if ( $maChaine =~ s(regex)(repl)flags ) {…} if ( $maChaine =~ s¤regex¤repl¤flags ) {…} if ( $maChaine =~ s#regex#repl#flags ) {…} Si le caractère choisi est /, le m n’est pas obligatoire: if ( $maChaine =~ /regex/gi ) {…}

Utilisation des REGEX Mise en œuvre : JAVASCRIPT

Utilisation des REGEX Mise en œuvre: dans ECLIPSE Ctrl + F MATCH: Cliquer sur « Find » SUBSTITUTE: Cliquer sur « Replace All »

Utilisation des REGEX Mise en œuvre : dans NOTEPAD++ Ctrl + F Sélectionner l’onglet « Remplacer » MATCH: Cliquer sur « Suivant » SUBSTITUTE: Cliquer sur « Remplacer » ou « Remplacer Tout » Attention! Les groupes sont constitués de \ et de leur numéro: \1,\2,\3 …

Utilisation des REGEX Mise en œuvre : VI Lancer l’éditeur Attention! MATCH: Taper /<regex> pour chercher une chaîne de caractères selon une REGEX Exemple: SUBSTITUTE: Taper :%s:<regex>:<replacement>:<flags> pour chercher et remplacer une chaîne par une autre Attention! Les caractères spéciaux suivants doivent être échappés (avec \): + { ( et ) | Le ? est remplacé par \= Les groupes sont constitués de \ et de leur numéro: \1,\2,\3 … Plus d’informations: http://www.softpanorama.org/Editors/Vimorama/vim_regular_expressions.shtml

Conclusion Une bonne expression régulière est une expression régulière: Concise Ecrire le strict minimum pour que cette expression régulière soit nécessaire et suffisante Claire Être capable de comprendre facilement cette expression régulière, même en la regardant longtemps après Qui correspond précisément au besoin Bien définir le besoin (les règles) Pas d’erreur possible en fonction de différentes chaînes de caractères en entrée

Bibliographie Wiki Eurelis: http://wiki.intranet.eurelis.net/index.php/Regex Test en ligne d’expressions régulières: http://www.fileformat.info/tool/regex.htm http://tools.ap2cu.com/regex Cours et exemples d’expressions régulières: http://www.regular-expressions.info Expressions régulières avancées: http://benhur.teluq.uqam.ca/SPIP/inf6104/article.php3?id_article=95&id_rubrique=6&sem=Semaine%204 Expression régulières en Java: http://java.sun.com/javase/7/docs/api/java/util/regex/Pattern.html Expressions régulières en PHP: http://www.php.net/manual/fr/reference.pcre.pattern.syntax.php Expressions régulières en Perl: http://sylvain.lhullier.org/publications/intro_perl/chapitre10.html http://www.univ-orleans.fr/webada/html/selfhtml_fr/cgiperl/langage/expresreg.htm Expressions régulières en Javascript: http://www.javascriptkit.com/javatutors/redev.shtml

Questions ? ?