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" без кавычек