Подтвердить что ты не робот

Как выполнить регулярные замены строк в чистом C?

Я просмотрел функции регулярных выражений в библиотеке регулярных выражений POSIX и библиотеке PCRE, но обе они, похоже, не имеют функции замены строк. Я не хочу использовать С++, и было бы лучше, если мне не нужно связывать другую библиотеку (но я могу, если мне нужно). Нужно ли мне вручную заменять строку? Если да, как я могу использовать группы захвата?

4b9b3361

Ответ 1

regex.h не предоставляет встроенную поддержку для замены строк, однако она предоставляет подвыражения/группы захвата, которые делают ее намного проще. Я предполагаю, что вы знакомы с компиляциями регулярных выражений и пропускаете выполнение и подвыражения регулярных выражений.

regexec() определяется следующим образом в regex.h(/usr/include/):

extern int regexec (const regex_t *__restrict __preg,
        const char *__restrict __string, size_t __nmatch,
        regmatch_t __pmatch[__restrict_arr],
        int __eflags);

Первый, второй и последний аргументы - это регулярное выражение, строка, которая должна быть выполнена и флаги выполнения соответственно. Третий и четвертый аргументы используются для указания массива regmatch_t. Параметр regmatch_t состоит из двух полей: rm_so и rm_eo, которые являются индексами или смещениями, от начала и конца соответствующей области соответственно. Затем можно использовать индексы, а также memcpy(), memset() и memmove() из string.h для выполнения замены строк.

Я сделаю небольшой пример и опубликую его позже.

Удачи, и я надеюсь, что это помогло.

Ответ 2

Сама библиотека PCRE не предоставляет функцию замены, но на странице загрузки PCRE доступна функция обертки, которая принимает синтаксис стиля =~ s/pattern/replace/ perl style, а затем использует собственные функции PCRE для замены/замены для вас. Перейдите в http://www.pcre.org/, затем нажмите ссылку "Загрузить": ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/, затем Contrib. Требуемый пакет/проект: pcrs-0.0.3-src.tar.gz.

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