Следующие функции позволяют
работать с регулярными выражениями на разных языках:
| 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.