c регулярным выражением howto - PullRequest
15 голосов
/ 27 октября 2009

Прошло 10 лет с тех пор, как я посмотрел на c. Мне нужно написать небольшую программу на C, которая анализирует строку. Я хотел использовать регулярные выражения, так как использую их годами, но не знаю, как это сделать в c. Я провел утреннюю погугливание и не могу найти простых примеров (например, используйте эту библиотеку, это методология). Может кто-нибудь дать мне простой пример?

Спасибо!

Ответы [ 4 ]

39 голосов
/ 27 октября 2009

Вы можете использовать PCRE :

Библиотека PCRE - это набор функций, которые реализуют сопоставление с шаблоном регулярного выражения с использованием того же синтаксиса и семантики, что и в Perl 5. PCRE имеет собственный собственный API, а также набор функций-оболочек, соответствующих API регулярного выражения POSIX , Библиотека PCRE бесплатна даже для создания коммерческого программного обеспечения.

См. pcredemo.c для примера PCRE.

Если вы не можете использовать PCRE, в вашей системе, вероятно, доступна поддержка регулярного выражения POSIX (, как указал @tinkertim ). Для Windows вы можете использовать пакет gnuwin Regex для Windows .

Документация regcomp включает следующий пример:

#include <regex.h>

/*
 * Match string against the extended regular expression in
 * pattern, treating errors as no match.
 *
 * Return 1 for match, 0 for no match.
 */

int
match(const char *string, char *pattern)
{
    int    status;
    regex_t    re;

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
        return(0);      /* Report error. */
    }
    status = regexec(&re, string, (size_t) 0, NULL, 0);
    regfree(&re);
    if (status != 0) {
        return(0);      /* Report error. */
    }
    return(1);
}
7 голосов
/ 27 октября 2009

Если принудительно вводить только в POSIX (без pcre), вот небольшой отступление:

#include <regex.h>
#include <stdbool.h>

bool reg_matches(const char *str, const char *pattern)
{
    regex_t re;
    int ret;

    if (regcomp(&re, pattern, REG_EXTENDED) != 0)
        return false;

    ret = regexec(&re, str, (size_t) 0, NULL, 0);
    regfree(&re);

    if (ret == 0)
        return true;

    return false;
}

Вы можете назвать это так:

int main(void)
{
   static const char *pattern = "/foo/[0-9]+$";

   /* Going to return 1 always, since pattern wants the last part of the
    * path to be an unsigned integer */
   if (! reg_matches("/foo/abc", pattern))
       return 1;

   return 0;
}

I весьма рекомендуем использовать PCRE, если он доступен. Но приятно это проверить и иметь какой-то откат назад.

Я извлек фрагменты из проекта, который в данный момент находится в моем редакторе. Это просто очень простой пример, но он дает вам типы и функции для поиска в случае необходимости. Этот ответ более или менее усиливает ответ Синана.

0 голосов
/ 27 октября 2009

Вы также должны взглянуть на библиотеку регулярных выражений. Он использует регулярные выражения, подобные тем, которые вы можете записать в оболочку Linux.

Для получения дополнительной информации в Linux введите "man regcomp" без кавычек

0 голосов
/ 27 октября 2009

Другой вариант, кроме нативной библиотеки C, заключается в использовании интерфейса с другим языком, таким как Python или Perl. Отсутствие необходимости иметь дело с обработкой строк в Си, а лучшая языковая поддержка регулярных выражений должна значительно упростить вам задачу. Вы также можете использовать такой инструмент, как SWIG , чтобы генерировать оболочки для вызова кода из C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...