Expressions régulières en C

Muhammad Zeeshan 12 octobre 2023
  1. Expressions régulières en C
  2. Construire une expression régulière en utilisant la méthode regcomp() en C
  3. Comparer des chaînes à une expression régulière compilée à l’aide de la méthode regexec() en C
Expressions régulières en C

Les expressions régulières en C seront le sujet de discussion dans cet article, avec un exemple.

Expressions régulières en C

Des expressions régulières, composées d’une chaîne de caractères, peuvent être utilisées pour découvrir des modèles de recherche. La correspondance de chaînes et d’autres applications similaires en font un usage intensif.

Il s’agit d’une approche standardisée pour faire correspondre des séquences de motifs avec des séquences de caractères. C, C++, Java et de nombreux autres langages de programmation majeurs l’utilisent.

Après avoir appris les expressions régulières, examinons quelques modèles de bibliothèque spécifiques à POSIX.

  • Retrouver les lettres ou les chiffres entre parenthèses est facile grâce à [].
  • [:number:] peut être utilisé pour localiser n’importe quel nombre.
  • [:word:] peut rechercher des lettres, des chiffres et des traits de soulignement.
  • [:lower:] est utilisé pour localiser les lettres minuscules de l’alphabet.

Construire une expression régulière en utilisant la méthode regcomp() en C

La méthode d’expression régulière regcomp() est utilisée pour compiler ou construire des expressions régulières. Il nécessite l’expression régulière, l’expression et l’indicateur.

L’expression est un type de chaîne, regex est une référence à une région de mémoire où l’expression est mise en correspondance et enregistrée, et l’indicateur est utilisé pour identifier le type de compilation.

Il renverra la valeur 0 si la compilation s’est terminée sans erreur. Et il affichera “Code d’erreur” si l’expression ne peut pas être compilée avec succès.

Syntaxe:

regcomp(&regex, expression, flag)

Exemple:

  • Créez une variable de type regex, et donnez-lui un nom comme nous l’avons fait r1.
    regex_t r1;
    
  • Maintenant, vous devez créer une variable qui contiendra le résultat du processus de génération de regex, comme vous pouvez le voir ci-dessous :
    int regval;
    
  • Générez une expression régulière en appelant la fonction :
    regval = regcomp(&r1, "[:word:]", 0);
    
  • Regular Expression compiled successfully. s’affichera après le processus de compilation.
    if (value == 0) {
      printf("Regular Expression compiled successfully.");
    }
    
  • Sinon, il lèvera une exception avec le message An Error Occurred..
    else {
      printf("An Error Occurred.");
    }
    

Code source complet :

#include <regex.h>
#include <stdio.h>

int main() {
  regex_t r1;
  int regval;
  regval = regcomp(&r1, "[:word:]", 0);
  if (regval == 0) {
    printf("Regular Expression compiled successfully.");
  } else {
    printf("An Error Occurred.");
  }
  return 0;
}

Production:

Regular Expression compiled successfully.

Comparer des chaînes à une expression régulière compilée à l’aide de la méthode regexec() en C

Il est possible de comparer une chaîne à un motif en utilisant la fonction regexec(). Il prend en compte certains paramètres : le premier est un modèle qui a été précompilé, une chaîne qui contient le modèle à rechercher, des informations sur l’emplacement des correspondances et des drapeaux qui décrivent un changement dans le comportement des correspondances.

Syntaxe:

regexec(&regex, expression, 0, NULL, 0);

S’il y a une correspondance, cela renverra la valeur 0. Et s’il n’y a pas de correspondance, cela renverra REG NOMATCH.

Exemple:

  • Pour commencer, nous allons créer une fonction nommée DisplayPattern qui affichera le résultat. Si la valeur est 0, il affichera Pattern found ; s’il n’est pas égal à 0, il affichera simplement Pattern not found. ; sinon, il affichera une invite d’erreur avec le message An error occurred..
    void DisplayPattern(int val) {
      if (val == 0) {
        printf("Pattern found.\n");
      } else if (val == REG_NOMATCH) {
        printf("Pattern not found.\n");
      } else {
        printf("An error occurred.\n");
      }
    }
    
  • Maintenant, nous allons créer la fonction Main où nous allons créer une variable de type regex_t nommée r1.
    regex_t r1;
    
  • Créez trois variables pour le type de retour nommé data1, data2, data3.
    int data1;
    int data2;
    int data3;
    
  • Ensuite, créez un regEx et comparez le motif avec la chaîne dans reg.
    data1 = regcomp(&r1, " I am a writing c language", 0);
    data1 = regexec(&r1, "Hi there its me Zeeshan", 0, NULL, 0);
    
  • Ajoutez quelques regEx supplémentaires comme indiqué ci-dessous et comparez le motif avec la chaîne dans reg.
    data2 = regcomp(&r1, "I am a writing c language", 0);
    data2 = regexec(&r1, " Lets do coding", 0, NULL, 0);
    
    data3 = regcomp(&r1, "My Name is Zeeshan Khan", 0);
    data3 = regexec(&r1, " My Name is Zeeshan Khan", 0, NULL, 0);
    
  • Enfin, affichez les motifs à l’aide de la fonction DisplayPattern que nous avons créée précédemment.
    DisplayPattern(data1);
    DisplayPattern(data2);
    DisplayPattern(data3);
    

Code source complet :

#include <regex.h>
#include <stdio.h>

void DisplayPattern(int val) {
  if (val == 0) {
    printf("Pattern found.\n");
  } else if (val == REG_NOMATCH) {
    printf("Pattern not found.\n");
  } else {
    printf("An error occurred.\n");
  }
}

int main() {
  regex_t r1;
  int data1;
  int data2;
  int data3;
  data1 = regcomp(&r1, " I am a writing c language", 0);
  data1 = regexec(&r1, "Hi there its me Zeeshan", 0, NULL, 0);

  data2 = regcomp(&r1, "I am a writing c language", 0);
  data2 = regexec(&r1, " Lets do coding", 0, NULL, 0);

  data3 = regcomp(&r1, "My Name is Zeeshan Khan", 0);
  data3 = regexec(&r1, " My Name is Zeeshan Khan", 0, NULL, 0);

  DisplayPattern(data1);
  DisplayPattern(data2);
  DisplayPattern(data3);
  return 0;
}

Production:

Pattern not found.
Pattern not found.
Pattern found.
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn