Algi.cz

  • Zvětšit velikost písma
  • Výchozí velikost písma
  • Zmenšit velikost písma
Home Základy Jazyka C Jazyk C - regulární výrazy - regex.h

Jazyk C - regulární výrazy - regex.h

Email Tisk PDF

Pro regulární výrazy existuje mnoho knihoven. Jako vcelku dobře použitelnou knihovnu jsem zvolil regex.h.

regex.h

Knihovna je součástí například glibc.

Práce s regulárními výrazy je poměrně jednoduchá. Uvedu jednoduchý příklad.

Program prohledá svůj první parametr podle regexpu.

Příklad regulárního výrazu v jazyce C

#include <stdio.h> //knihovna vstup/vystup
#include <stdlib.h> //standartni knihovna
#include <string.h> //knihovna pro praci s retezci
#include <locale.h> //cestina
#include <regex.h> //funkce pro praci s regularnimi vyrazy
#define BUFFER 100 //definice konstanty - buffer

int main(int argc, char *argv[]) { //parametry prikazove radky

//nasledujici pole reprezentuje polozky nalezene regularnim vyrazem
//v pmatch[0] je ulozen vysledek celeho regularniho vyrazu
//v pmatch[1] je ulozen vysledek prvni zavorky v regularnim vyrazu
//nam staci pole rozmeru 2, ale pokud bude vas regularni vyraz slozitejsi
//a bude obsahovat vice zavorek, musite pole zvetsit
regmatch_t pmatch[2]; //pole pro ulozeni vysledku regexpu

//patern regularniho vyrazu
char *pattern = "^\\+abc(def)$"; //v cecku musite psat \\ a ne \ pro escape sekvence
char string[BUFFER];
regex_t re; //instance regularniho vyrazu
int status;
char buf[BUFFER]; //buffer

//zkontroluje, jestli jste zadali parametr pri spusteni
if (argc<2) {
printf("Wrong parameters\n"); //nezadali jste parametr, se kterym pracuje regexp
return(1); //konec programu s navratovou hodnotou 1
}
strcpy(string,argv[1]); //zkopiruje argument do string

//zkompiluje pattern do regularniho vyrazu, pokud nastala chyba, ukonci program s hodnotou 1
if(regcomp( &re, pattern, REG_EXTENDED)!= 0) {
fprintf(stderr,"Regex compiling error!\n");
return(1);
}

//vykona regularni vyraz. Pokud retezec nalezi regularnimu vyrazu, vrati 0
status = regexec( &re, string, 2, pmatch, 0); //cislo 2 souvisi s velikosti pole pmatch[2] !!!
if(status == 0){
strncpy(buf,string+pmatch[1].rm_so,pmatch[1].rm_eo-pmatch[1].rm_so);//zkopiruje vysledek do buf, vysvetleni nize
printf("Match!!!: %s\n", buf);
} else {
regerror(status, &re, buf, BUFFER);
fprintf(stderr,"Error: %s\n", buf); //chyba regularniho vyrazu na chybovy vystup
}
regfree( &re); //uvolneni pameti zabrane regularnim vyrazem
}

Pro přeložení použijete gcc s těmito parametry:  gcc -std=c99 -Wall -pedantic -W main.c -o main

Ještě bych chtěl zmínit největší zdroj chyb.

Musíte si dávat pozor na to, aby jste pole pmatch[2] dimenzovali na skutečný (alespoň minimální) počet výsledků regulárního výrazu, stejně tak uvést stejný počet u volání funkce regexec( &re, string, 2, pmatch, 0) v třetím parametru, jinak váš program končí pravděpodobně výpisem "segmentation fault"

 

Aktualizováno Neděle, 14 Březen 2010 11:24  

Přidat komentář


Bezpečnostní kód
Obnovit

Banner