Следующие функции позволяют
работать с регулярными выражениями на разных языках:
regcomp | Компилирует заданное простое или расширенное регулярное выражение в исполняемую строку. |
regexec | Сравнивает строку с откомпилированным простым или расширенным регулярным выражением, полученным функцией regcomp. |
regerror | Преобразует коды ошибок, возвращаемые функциями regcomp и regexec, в текстовые сообщения. |
regfree | Освобождает память, выделенную функцией regcomp для хранения откомпилированного простого или расширенного регулярного выражения. После применения функции regfree регулярное выражение перестает быть откомпилированным. |
fnmatch | Проверяет строку на соответствие указанному шаблону. Функция fnmatch может применяться в приложении, просматривающем словарь для нахождения записей, соответствующих заданному шаблону. Кроме того, функция fnmatch применяется для сравнения с шаблоном путей к файлам. |
#include <locale.h> #include <regex.h> #define BUFSIZE 256 main() { char *p; char *pattern[] = { "hello[0-9]*", "1234" }; char *string = "this is a test string hello112 and this is test"; /* Строка для сравнения */ int retval; regex_t re; char buf[BUFSIZE]; int i; setlocale(LC_ALL, ""); for(i = 0;i <2; i++){ retval = match(string, pattern[i], &re); if(retval == 0){ printf("Обнаружено соответствие \n"); }else{ regerror(retval, &re, buf, BUFSIZE); printf("ошибка = %s\n", buf); } } regfree( &re); } int match(char *string, char *pattern, regex_t *re) { int status; if((status=regcomp( re, pattern, REG_EXTENDED))!= 0) return(status); status = regexec( re, string, 0, NULL, 0); return(status); }
#include <locale.h> #include <regex.h> #define BUFSIZE 256 main() { char *p; char *pattern = "[0-9]"; char *string = "Сегодня 11 февраля 1992 г."; int retval; regex_t re; char buf[BUFSIZE]; regmatch_t pmatch[100]; int status; char *ps; int eflag; setlocale(LC_ALL, ""); /* Компиляция шаблона */ if((status = regcomp( &re, pattern, REG_EXTENDED))!= 0){ regerror(status, &re, buf, 120); exit(2); } ps = string; printf("Строка для сравнения: %s\n", ps); eflag = 0; /* Найти все соответствия */ while( status = regexec( &re, ps, 1, pmatch, eflag)== 0){ printf("найдено соответствие в позиции %d, строка: %s\n", pmatch[0].rm_so, ps+pmatch[0].rm_so); ps += pmatch[0].rm_eo; printf("\nследующая строка для сравнения: %s\n", ps); eflag = REG_NOTBOL; } regfree( &re); }
#include <locale.h> #include <fnmatch.h> #include <sys/dir.h> main(int argc, char *argv[] ) { char *pattern; DIR *dir; struct dirent *entry; int ret; setlocale(LC_ALL, ""); dir = opendir("."); pattern = argv[1]; if(dir != NULL){ while( (entry = readdir(dir)) != NULL){ ret = fnmatch(pattern, entry->d_name, FNM_PATHNAME|FNM_PERIOD); if(ret == 0){ printf("%s\n", entry->d_name); }else if(ret == FNM_NOMATCH){ continue ; }else{ printf("error file=%s\n", entry->d_name); } } closedir(dir); } }
Глава 16, Поддержка национальных языков.
Функции fnmatch, regcomp, regerror, regexec, regfree.