C регулярное выражение

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

Спасибо!

Ответы

Ответ 1

Вы можете использовать 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);
}

Ответ 2

Если принудительно только в 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;
}

Я высоко рекомендую использовать PCRE, если он доступен. Но, его приятно проверить на это и отчасти вернуться.

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

Ответ 3

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

Ответ 4

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

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