Как сделать регулярные замены строк в чистом C? - PullRequest
13 голосов
/ 08 ноября 2011

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

Ответы [ 2 ]

23 голосов
/ 08 ноября 2011

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 для замены строки.

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

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

6 голосов
/ 08 ноября 2011

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

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

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