Cómo utilizar expresiones regulares en lenguaje C
Al ver que todos discuten este aspecto, haga algunas contribuciones para expresar la dedicación desinteresada de todos los expertos a esta versión: Ups:
Si el usuario está familiarizado con sed, awk, grep o vi, entonces definitivamente estarás familiarizado con el concepto de expresiones regulares. Debido a que puede simplificar enormemente la complejidad del procesamiento de cadenas, ahora se ha utilizado en muchas utilidades de Linux. No crea que las expresiones regulares son solo una patente para lenguajes de secuencias de comandos como Perl, Python y Bash. Como programadores de lenguaje C, los usuarios también pueden usar expresiones regulares en sus propios programas.
Ni C ni C estándar admiten expresiones regulares, pero existen algunas bibliotecas de funciones que pueden ayudar a los programadores de C/C a completar esta función, la más famosa de las cuales es la Biblioteca de expresiones regulares compatible con Perl de Philip Hazel, muchas Las distribuciones de Linux vienen con esta biblioteca de funciones.
Compila expresiones regulares
Para mejorar la eficiencia, antes de comparar una cadena con una expresión regular, primero debes compilarla con la función regcomp() y convertirla a la estructura regex_t. :
int regcomp(regex_t *preg, const char *regex, int cflags);
El parámetro regex es una cadena que representa la expresión regular que se va a compilar; El parámetro preg apunta a una estructura de datos declarada como regex_t, utilizada para guardar los resultados de la compilación; el parámetro cflags determina los detalles de cómo se debe procesar la expresión regular.
Si la función regcomp() se ejecuta correctamente y el resultado de la compilación se completa correctamente en preg, la función devolverá 0. Cualquier otro resultado devuelto significa que se ha producido algún tipo de error.
Coincidencia de expresiones regulares
Una vez que la expresión regular se compila correctamente usando la función regcomp(), se puede llamar a la función regexec() para completar la coincidencia de patrones:
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
El parámetro preg apunta a la expresión regular compilada, la cadena del parámetro es la cadena que debe coincidir y los parámetros nmatch y pmatch. se utilizan para devolver los resultados coincidentes al programa que llama. El último parámetro eflags determina los detalles coincidentes.
En el proceso de llamar a la función regexec() para la coincidencia de patrones, puede haber varios lugares en la cadena que coincidan con la expresión regular dada. El parámetro pmatch se utiliza para garantizar que
, de la cadena pmatch[0].rm_so a la cadena pmatch[0].rm_eo es la primera cadena coincidente, y de
string pmatch[ 1].rm_so a la cadena pmatch[1].rm_eo es la segunda cadena coincidente, y así sucesivamente.
Liberar expresiones regulares
Siempre que una expresión regular compilada ya no sea necesaria, se debe llamar a la función regfree() para liberarla y evitar pérdidas de memoria.