[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Функции работы с регулярными выражениями на разных языках

Следующие функции позволяют работать с регулярными выражениями на разных языках:

regcomp Компилирует заданное простое или расширенное регулярное выражение в исполняемую строку.
regexec Сравнивает строку с откомпилированным простым или расширенным регулярным выражением, полученным функцией regcomp.
regerror Преобразует коды ошибок, возвращаемые функциями regcomp и regexec, в текстовые сообщения.
regfree Освобождает память, выделенную функцией regcomp для хранения откомпилированного простого или расширенного регулярного выражения. После применения функции regfree регулярное выражение перестает быть откомпилированным.
fnmatch Проверяет строку на соответствие указанному шаблону. Функция fnmatch может применяться в приложении, просматривающем словарь для нахождения записей, соответствующих заданному шаблону. Кроме того, функция fnmatch применяется для сравнения с шаблоном путей к файлам.

Примеры

  1. В следующем примере выполняется компиляция двух регулярных выражений и сравнение с ними некоторой строки. Совпадение обнаруживается для первого шаблона и не обнаруживается для второго.

    #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);
    }
    
  2. В следующем примере в строке находятся все подстроки, соответствующие заданному шаблону. Должны быть найдены числа 11 и 1992. Каждая цифра считается отдельным совпадением. Должно быть найдено 6 соответствий - для каждой из 6 цифр строки.

    #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);
    }
    
  3. В следующем примере содержимое каталога считывается и сравнивается с заданным шаблоном с помощью функции fnmatch.

    #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.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]