Dilib, module RegExp, fonction RegExpExtract

De Wicri Outils
LogoDilib.gif
Panneau travaux.png
Bibliothèque Dilib (ressources numériques)
Module RegExp

La fonction RegExpExtract retourne une copie de la partie reconnue par une expression régulière.

 

Synopsis

#include "RegExp.h"

char *RegExpExtract ( RexExp* re, char *str );
Paramètres
  • RexExp* re est une expression régulière compilée par RegExpCreate.
  • char *str est la chaîne à analyser.

Description

La fonction RegExpExtract analyse une chaîne de caractère str à l'aide d'une expression régulière préalablement compilée par RegExpCreate.

Elle retourne :

  • la valeur NULL si l'expression n'est pas reconnue,
  • une copie de la sous-chaine reconnue.

Elle positionne deux variables globales :

  • RegExpLoc1 : est un pointeur vers le début de la partie reconnue dans str.
  • RegExpLoc2 : pointe vers le caractère qui suit la partie reconnue dans str.

Attention

Chaque appel de RegExpExtract crée une nouvelle chaîne. Il convient donc de la libérer par un free().

Exemple

Impression de tous les graphies contenant « philolog » dans une flux HFD.

Pour pouvoir faire facilement des énumérations, le programme génère des triplets contenant :

  1. la chaîne reconnue,
  2. la clé HFD,
  3. un numéro d'ordre (numMatch).
#include "Buffer.h"
#include "RegExp.h"
#include <stdio.h>
#include <string.h>

int main()
{
  RegExp *rePhilo;
  Buffer *bufDoc;
  Buffer *bufKey;
  
  rePhilo=RegExpCreate("[A-Za-z]*[Pp][Hh][Ii][Ll][Oo][Ll][Oo][Gg][A-Za-z]*");
  bufDoc=BufferCreate(1000,1000);
  bufKey=NewBuffer();
  
  while (BufferGets(bufDoc))
    {
      char   *posTab;
      char   *match;
      char   *beginToParse;
      int     numMatch;
      
      posTab=strchr(BufferString(bufDoc), '\t');
      if (posTab)BufferStrncpy(bufKey, BufferString(bufDoc), posTab-BufferString(bufDoc));
      
      beginToParse=BufferString(bufDoc);
      numMatch=0;
      match=RegExpExtract(rePhilo, beginToParse);
      while (match)
	{
	  numMatch++;
	  printf("%s", match);
	  free (match);

	  if (posTab) 
	    {
	      printf("\t%s\t%d\n", BufferString(bufKey), numMatch);
	    }
	  else putchar('\n');

	  beginToParse=RegExpLoc2;
	  match=RegExpExtract(rePhilo, beginToParse);
      }
    }
  exit(EXIT_SUCCESS);
}


Si le source est rangé dans un fichier « findPhilolog », la compilation se fait ainsi :

gcc findPhilolog.c $DILIB_CC -o findPhilolog

Voir aussi

Sur Wicri/Manuel, l'exemple donné sur cette page sert de base à un tutoriel sur l'extraction de graphies dans un corpus.