Expresiones Regulares en C

Muhammad Zeeshan 12 octubre 2023
  1. Expresiones regulares en C
  2. Construya una expresión regular utilizando el método regcomp() en C
  3. Compare cadenas con una expresión regular compilada utilizando el método regexec() en C
Expresiones Regulares en C

Las expresiones regulares en C serán el tema de discusión en este artículo, junto con un ejemplo.

Expresiones regulares en C

Las expresiones regulares, que consisten en una cadena de caracteres, se pueden usar para descubrir patrones de búsqueda. La coincidencia de cadenas y otras aplicaciones similares hacen un uso extensivo de ella.

Son un enfoque estandarizado para hacer coincidir secuencias de patrones con secuencias de caracteres. C, C++, Java y muchos otros lenguajes de programación importantes lo utilizan.

Después de aprender acerca de las expresiones regulares, veamos algunos patrones de biblioteca específicos de POSIX.

  • Encontrar las letras o números encerrados entre corchetes es fácil usando [].
  • [:number:] se puede utilizar para localizar cualquier número.
  • [:word:] puede buscar letras, dígitos y guiones bajos.
  • [:lower:] se utiliza para localizar las letras minúsculas del alfabeto.

Construya una expresión regular utilizando el método regcomp() en C

El método de expresión regular regcomp() se utiliza para compilar o construir expresiones regulares. Requiere la expresión regular, la expresión y la bandera.

La expresión es un tipo de cadena, regex es una referencia a una región de memoria donde la expresión se compara y se guarda, y la bandera se usa para identificar el tipo de compilación.

Devolverá el valor 0 si la compilación se ha completado sin errores. Y generará un código de error si la expresión no se puede compilar correctamente.

Sintaxis:

regcomp(&regex, expression, flag)

Ejemplo:

  • Cree una variable del tipo regex y asígnele un nombre como lo hicimos r1.
    regex_t r1;
    
  • Ahora, debe crear una variable que contenga el resultado del proceso de generación de expresiones regulares, como puede ver a continuación:
    int regval;
    
  • Genere una expresión regular llamando a la función:
    regval = regcomp(&r1, "[:word:]", 0);
    
  • Regular Expression compiled successfully. se mostrará después del proceso de compilación.
    if (value == 0) {
      printf("Regular Expression compiled successfully.");
    }
    
  • De lo contrario, arrojará una excepción con el mensaje An Error Occurred..
    else {
      printf("An Error Occurred.");
    }
    

Código fuente completo:

#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;
}

Producción :

Regular Expression compiled successfully.

Compare cadenas con una expresión regular compilada utilizando el método regexec() en C

Es posible comparar una cadena con un patrón utilizando la función regexec(). Considera algunos parámetros: el primero es un patrón que ha sido precompilado, una cadena que contiene el patrón a buscar, información sobre la ubicación de las coincidencias y banderas que describen un cambio en el comportamiento de las coincidencias.

Sintaxis:

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

Si hay coincidencia, esto devolverá el valor 0. Y si no hay coincidencia, devolverá REG NOMATCH.

Ejemplo:

  • Para comenzar, crearemos una función llamada DisplayPattern que mostrará el resultado. Si el valor es 0, mostrará Pattern found.; si no es igual a 0, simplemente mostrará Pattern not found.; de lo contrario, mostrará un mensaje de error con el mensaje 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");
      }
    }
    
  • Ahora, crearemos la función Main donde crearemos una variable de tipo regex_t llamada r1.
    regex_t r1;
    
  • Cree tres variables para el tipo de devolución denominado data1, data2, data3.
    int data1;
    int data2;
    int data3;
    
  • Luego, crea un regEx y compara el patrón con la cadena en reg.
    data1 = regcomp(&r1, " I am a writing c language", 0);
    data1 = regexec(&r1, "Hi there its me Zeeshan", 0, NULL, 0);
    
  • Agregue algunos regEx más como se muestra a continuación y compare el patrón con la cadena en 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);
    
  • Por último, muestra los patrones usando la función DisplayPattern que creamos antes.
    DisplayPattern(data1);
    DisplayPattern(data2);
    DisplayPattern(data3);
    

Código fuente completo:

#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;
}

Producción :

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