c практическое руководство регулярного выражения

Что относительно dib или di( .

Это удалит внутренний (...) блок, где курсор.

я люблю текстовый объект движения и выборы!

15
задан jeffkolez 25 January 2018 в 20:52
поделиться

4 ответа

Вы можете использовать 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);
}
39
ответ дан 1 December 2019 в 00:37
поделиться

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

0
ответ дан 1 December 2019 в 00:37
поделиться

Если принудительно использовать только 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, если оно доступно. Но приятно проверить наличие этого и получить какой-то запасной вариант.

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

7
ответ дан 1 December 2019 в 00:37
поделиться

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

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

-1
ответ дан 1 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: