Expressions rationnelles POSIX (regular expressions)



Documents pareils
Le traitement du temps

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Le prototype de la fonction main()

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

INFO-F-105 Language de programmation I Séance VI

Cours d initiation à la programmation en C++ Johann Cuenin

Cours d Algorithmique et de Langage C v 3.0

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Programmation système de commandes en C

Générer un analyseur avec Flex&Bison

Claude Delannoy. 3 e édition C++

Introduction à l héritage en C++

Introduction au langage C

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1


Lier Erlang avec d autres langages de programmation

Programmation système I Les entrées/sorties

Le langage C. Séance n 4

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Programmation système en C/C++

Programmation C++ (débutant)/instructions for, while et do...while

et Programmation Objet

Algorithmique et Programmation, IMA

1.6- Génération de nombres aléatoires

Arguments d un programme

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Introduction à la Programmation Parallèle: MPI

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Conventions d écriture et outils de mise au point

Introduction à l algorithmique et à la programmation M1102 CM n 3

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours 6 : Tubes anonymes et nommés

ALGORITHMIQUE ET PROGRAMMATION En C

Cours Programmation Système

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

3IS - Système d'exploitation linux - Programmation système

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Représentation d un entier en base b

Programmation en C/C++

Introduction au pricing d option en finance

as Architecture des Systèmes d Information

Cours 1: Java et les objets

Programmation stochastique

INF 321 : mémento de la syntaxe de Java

Présentation du langage et premières fonctions

Informatique I. Sciences et Technologies du Vivant (Semestre 1)

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Introduction au calcul parallèle avec OpenCL

Bases de programmation. Cours 5. Structurer les données

(structure des entêtes)

COMPARAISONDESLANGAGESC, C++, JAVA ET

UE Programmation Impérative Licence 2ème Année

Cours de C. Allocation dynamique. Sébastien Paumier

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Programme Compte bancaire (code)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

GESTION DES FICHIERS C/UNIX

TP, première séquence d exercices.

TP : Gestion d une image au format PGM

TD3: tableaux avancées, première classe et chaînes

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

OS Réseaux et Programmation Système - C5

Corrigés des premiers exercices sur les classes

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Utilisation d objets : String et ArrayList

Premiers Pas en Programmation Objet : les Classes et les Objets

Exercice sur les Dockers

Cours de C/C++ par la pratique. Hugues Talbot

Programmation en Java IUT GEII (MC-II1) 1

Introduction à la programmation concurrente

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Structure d un programme

Structurer ses données : les tableaux. Introduction à la programmation

Programmer en JAVA. par Tama

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

PROJET 1 : BASE DE DONNÉES REPARTIES

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Initiation à l algorithmique

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

TP 1. Prise en main du langage Python

Plan Pédagogique du cours

Introduction aux Systèmes et aux Réseaux

Une introduction à Java

Chapitre 2. Classes et objets

Programmation C. J.-F. Lalande. 15 novembre 2012

Projet de programmation (IK3) : TP n 1 Correction

Programmation impérative

Exercices sur les interfaces

Plan global Outils de développement et compilation. Plan. Objectifs des outils présentés. IDE, GCC/Clang, ASAN, perf, valgrind, GDB.

Transcription:

Techniques de compilation Expressions rationnelles POSIX (regular expressions) Généralités Mise en œuvre dans la libc Fabrice Harrouet École Nationale d Ingénieurs de Brest harrouet@enib.fr http://www.enib.fr/~harrouet/ enib, F.H... 1/24

But/Principe Comparer une séquence de caractères à un motif Recherche de mot-clefs Découpage en champs Analyse lexicale,... Utilisation de caractères spéciaux Portions de texte explicites Ensembles ou classes de caractères Jokers Répétitions de sous-motifs,... Ces motifs sont des expressions rationnelles (ER) enib, F.H... 2/24

Démarche Compilation de l expression rationnelle Effectuée une seule fois pour chaque ER Analyse de l ER (dans sa forme textuelle) Constitution de structures de données internes ( machine à états) Confrontation à la séquence de caractères Effectuée pour chaque ER et chaque séquence Y-a-t il correspondance? Repérage de l ER dans la séquence Repérage de sous-er enib, F.H... 3/24

Exemple informel ER à reconnaître : (abc)(12)(xy) Constitué de trois sous-er Les parenthèses sont des caractères spéciaux Confrontation à la séquence : helloabc12xyworld Il y a correspondance L ER est repérée en [5;12[ : abc12xy Les sous-er sont repérées en [5;8[ : abc [8;10[ : 12 [10;12[ : xy enib, F.H... 4/24

Constitution d une ER Une expression rationnelle : une ou plusieurs branches séparées par Une branche : une ou plusieurs pièces concatenées Une pièce : un atome éventuellement suivi d un indicateur d occurence Un atome :... Un indicateur d occurence :... enib, F.H... 5/24

Contenu d un atome Un caractère litéral Les caractères ^.[$() *+?\ sont spéciaux on neutralise leur effet avec \ ex : a\.b a.b Les caractères ( ) : enferment une sous-er Le caractère. : représente un caractère différent de \n Le caractère ^ : représente le début d une ligne ex : ^abc abc à condition que ce soit en début de ligne Le caractère $ : représente la fin d une ligne ex : abc$ abc à condition que ce soit en fin de ligne Les caractères [ ] : enferment une classe de caractères... enib, F.H... 6/24

Définition d une classe de caractères [... ] : représente UN caractère parmi tous ceux énumérés ex : [ab][12] a1, a2, b1 ou b2 Plages de caractères indiquées par - ex : [0-9a-fA-F] UN chiffre hexadécimal Les caractères spéciaux perdent leur rôle sauf - et ] placer ] au début et - au début ou à la fin des [... ] [^... ] : représente UN caractère différent de ceux énumérés ex : [^ a-za-z] un caractère qui ne soit ni une lettre, ni un [:... :] : fait référence à une classe prédéfinie de caractères alnum alpha blank cntrl digit graph lower print punct space upper xdigit (voir <ctype.h> : isalpha()... ) ex : [^ [:alnum:]] = [^ [:alpha:][:digit:]] [^ a-za-z0-9] enib, F.H... 7/24

Les indicateurs d occurence Un atome seul : Une fois et une seule cet atome A? : Zéro ou une fois l atome A A + : Une ou plusieurs fois l atome A A * : Zéro, une ou plusieurs fois l atome A A n : Exactement n fois l atome A A n, : n fois ou plus l atome A A n,m : De n à m fois l atome A (n m ) Ne concernent que l atome immédiatement précédent! ex : ab3 abbb alors que (ab)3 ababab enib, F.H... 8/24

Quelques exemples d ER entier décimal simple : [[:digit:]]+ ou [0-9]+ entier octal : 0[01234567]+ ou 0[0-7]+ entier hexadécimal : 0[xX][[:xdigit:]]+ ou 0[xX][0-9a-fA-F]+ autre entier décimal : [123456789][[:digit:]]* 0 ou [1-9][0-9]* 0 identificateur : [ [:alpha:]][ [:alnum:]]* ou [ a-za-z][ a-za-z0-9]* commentaire C++ : //.* réel : (([0-9]+\.[0-9]*) ([0-9]*\.[0-9]+))([eE][+-]?[0-9]+)? [0-9]+[eE][+-]?[0-9]+ chaîne simple : "([^"] \\")*" enib, F.H... 9/24

L API POSIX Repose sur quatre fonctions et deux structures regcomp() : compilation d une ER regerror() : message d erreur de compilation regexec() : confrontation chaîne/er compilée regfree() : destruction de l ER compilée regex t : représente l ER compilée regmatch t : résultat d une confrontation + des constantes pour paramétrer les fonctions Déclarations : <sys/types.h> et <regex.h> Implémentation : Dans la libc standard Documentation : man 3 regcomp et man 7 regex enib, F.H... 10/24

L API POSIX Compilation d une ER int regcomp(regex t * preg,const char * regex,int cflags); Initialise *preg avec le résultat de la compilation de regex Options cflags à combiner par REG EXTENDED : toujours présent! Utilisation des ER modernes, pas les basiques (obsolètes) REG NEWLINE : toujours présent! Le. n inclu pas le \n, ainsi ^ et $ fonctionnent REG NOSUB : On ne cherche pas à situer l ER dans la séquence analysée, juste un test de correspondance REG ICASE : Pas de distinction majuscule/minuscule Résultat : 0 si compilation ok, 0 si erreur enib, F.H... 11/24

L API POSIX Message d erreur de compilation size t regerror(int err,const regex t * preg, char * buf,size t buf size); La compilation de *preg doit avoir retourné err Le message descriptif est placé dans buf de taille buf size (tronqué si trop petit) Résultat : taille du buffer nécessaire pour le message complet Démarche usuelle : invoquer avec buf et buf size nuls allouer buf à la taille indiquée invoquer à nouveau avec buf et la taille allouée utiliser buf (affichage... ) libérer buf enib, F.H... 12/24

L API POSIX Libération de l ER compilée void regfree(regex t * preg); Libere les ressources allouées dans *preg lors de l opération regcomp() enib, F.H... 13/24

Compilation d une ER #include <sys/types.h> $./prog "[0-9]+" #include <regex.h> [0-9]+ --> Compilation OK #include <iostream> $ using namespace std; $./prog "[0-9+" int main(int argc,char ** argv) [0-9+ --> Invalid regular expression $ if(argc>=2) regex_t re; int r=regcomp(&re,argv[1],reg_extended REG_NEWLINE); if(r) size_t sz=regerror(r,&re,(char *)0,0); char * buffer=new char[sz]; regerror(r,&re,buffer,sz); cerr << argv[1] << " --> " << buffer << endl; delete[] buffer; else cerr << argv[1] << " --> Compilation OK" << endl; regfree(&re); return(0); enib, F.H... 14/24

L API POSIX Confrontation chaîne/er compilée int regexec(const regex t * preg,const char * str, size t nb,regmatch t * match,int eflags); Confronte la chaîne str à l ER compilée dans *preg Options eflags à combiner par REG NOTBOL : ^ ne fonctionne pas REG NOTEOL : $ ne fonctionne pas Servent à l analyse d une ligne par parties successives Les informations de repérage des ER et des sous-er sont placées dans *match de taille nb (nb vaut généralement preg->re nsub+1 ou 1) Résultat : 0 si correspondance, 0 sinon enib, F.H... 15/24

L API POSIX Repérage des ER et sous-er La structure regmatch t contient deux indices relatifs à str : rm so et rm eo : début et fin de correspondance -1 si pas de correspondance Une ER compilée re contient re.re nsub sous-er regexec() initialise match si REG NOSUB est absent de regcomp() match[0] : ER globale match[1] : première sous-er (première ( rencontrée) match[re.re nsub] : dernière sous-er (dernière ( rencontrée) Si match de taille 1 repérage de l ER uniquement Si match de taille re.re nsub+1 repérage de toutes les sous-er Voir l exemple introductif en page 4 enib, F.H... 16/24

Test de correspondance 1/2 #include <sys/types.h> $./prog "[0-9]+" "abc123xyz" #include <regex.h> [0-9]+ matches abc123xyz #include <iostream> $ using namespace std; $./prog "[0-9]+" "abcxyz" int main(int argc,char ** argv) [0-9]+ does not match abcxyz $ if(argc>=3) regex_t re; int r=regcomp(&re,argv[1],reg_extended REG_NEWLINE REG_NOSUB); // no location info if(r) size_t sz=regerror(r,&re,(char *)0,0); char * buffer=new char[sz]; regerror(r,&re,buffer,sz); cerr << argv[1] << " --> " << buffer << endl; delete[] buffer; enib, F.H... 17/24

Test de correspondance 2/2 else // regcomp() success if(regexec(&re,argv[2],0,(regmatch_t *)0,0)) // 0 regmatch_t required cerr << argv[1] << " does not match " << argv[2] << endl; else cerr << argv[1] << " matches " << argv[2] << endl; regfree(&re); return(0); enib, F.H... 18/24

Repérage de la correspondance 1/2 #include <sys/types.h> $./prog "[0-9]+" "abc123xyz" #include <regex.h> [3;6[ --> 123 #include <string.h> $ #include <iostream> $./prog "[0-9]+" "abcxyz" using namespace std; [0-9]+ does not match abcxyz int main(int argc,char ** argv) $ if(argc>=3) regex_t re; int r=regcomp(&re,argv[1],reg_extended REG_NEWLINE); if(r) size_t sz=regerror(r,&re,(char *)0,0); char * buffer=new char[sz]; regerror(r,&re,buffer,sz); cerr << argv[1] << " --> " << buffer << endl; delete[] buffer; enib, F.H... 19/24

Repérage de la correspondance 2/2 else // regexec() success regmatch_t m; if(regexec(&re,argv[2],1,&m,0)) // only 1 regmatch_t required cerr << argv[1] << " does not match " << argv[2] << endl; else const char * start=argv[2]+m.rm_so; unsigned int len=m.rm_eo-m.rm_so; char tmp[0x100]; strncpy(tmp,start,len); tmp[len]= \0 ; cerr << "[" << m.rm_so << ";" << m.rm_eo << "[ --> " << tmp << endl; regfree(&re); return(0); enib, F.H... 20/24

Détail de la correspondance 1/3 #include <sys/types.h> #include <regex.h> #include <string.h> #include <iostream> using namespace std; int main(int argc,char ** argv) if(argc>=3) regex_t re; int r=regcomp(&re,argv[1],reg_extended REG_NEWLINE); if(r) size_t sz=regerror(r,&re,(char *)0,0); char * buffer=new char[sz]; regerror(r,&re,buffer,sz); cerr << argv[1] << " --> " << buffer << endl; delete[] buffer; enib, F.H... 21/24

Détail de la correspondance 2/3 else // regcomp() success unsigned int nb=re.re_nsub+1; regmatch_t * m=new regmatch_t[nb]; if(regexec(&re,argv[2],nb,m,0)) // all sub-expressions required cerr << argv[1] << " does not match " << argv[2] << endl; else // regexec() success for(unsigned int i=0;i<nb;i++) if(m[i].rm_so==-1) cerr << "<" << i << ">???" << endl; else enib, F.H... 22/24

Détail de la correspondance 3/3 const char * start=argv[2]+m[i].rm_so; unsigned int len=m[i].rm_eo-m[i].rm_so; char tmp[0x100]; strncpy(tmp,start,len); tmp[len]= \0 ; cerr << "<" << i << "> [" << m[i].rm_so << ";" << m[i].rm_eo << "[ --> " << tmp << endl; regfree(&re); return(0); $./prog "([0-9]+\\.[0-9]* [0-9]*\\.[0-9]+)([eE][+-]?[0-9+])?" "X12.34e56Y" <0> [1;8[ --> 12.34e5 <1> [1;6[ --> 12.34 <2> [6;8[ --> e5 $./prog "([0-9]+\\.[0-9]* [0-9]*\\.[0-9]+)([eE][+-]?[0-9+])?" "X12.34Y" <0> [1;6[ --> 12.34 <1> [1;6[ --> 12.34 <2>??? enib, F.H... 23/24

Quelques remarques Saisie des ER Contenu d une chaîne saisie dans le code ou en ligne de commande char s[]="a\nb\tc"; est équivalent à char s[]= a, \n, b, \t, c, \0 ; Neutralisation en C ou en Shell neutralisation dans l ER Pour [0-9]+\.[0-9]* char s[]="[0-9]+\\.[0-9]*"; Pour "([^"] \\")*" char s[]="\"([^\"] \\\\\")*\""; ER POSIX : minimum disponible partout Quelques subtilités supplémentaires ignorées ici Mises en œuvre dans egrep, awk, sed, vi... Des variantes plus complètes dans flex, perl, java 1.4... enib, F.H... 24/24