«

»

Mar 16

Back to pure C – как распарсить строку без регэкспов

Надо парсить строку. Хочется регеэкспов от Posix – но никто не обещает posix-совместимых систем. Проект сишный и плюшки C++ как то не уместны, потому же boost – нельзя. И вообще с учетом закостенелости процесса развертывания – сторонние либы включать адски не желательно. Под такие ограничения прекрасно подходит функция strtok из ANSI C.

Нижеуказанный сниппет производит разбор строки, выдавая на каждой итерации участок строки между заданными разделителями. Разделители при необходимости можно на очередной итерации изменить. Учтите – оригинальную строку – свой первый параметр – данная функция изменяет. Учтите, если строка состоит из одних разделителей – она может вернуть не нулевое значение.

    char* test_string = "a:bgf,tre";
    char* pch = strtok (test_string,":,");
    while (pch != NULL)
    {
        /*
           TODO: processing string parts
        */
        pch = strtok (NULL, ":,");
    }

Ее приемница, функция strsep умеет работать с массивом строк, но, при этом проигрывает в портабельности.
Пример использования strsep для парсинга строк, с разбивкой на пробелы и табы, нагло скопипащенный из мана:

char **ap, *argv[10], *inputstring;

for (ap = argv; (*ap = strsep(&inputstring, " \t")) != NULL;)
    if (**ap != '\0')
    {
        /*
           TODO: processing string parts
        */
       if (++ap >= &argv[10])
          break;
    }

В качестве зы – ссылка на код утилиты grep, где можно посмотреть как работать с символами wildcard при анализе имен файлов:
http://cm.bell-labs.com/cm/cs/tpop/grep.c

1 comment

  1. Alexander

    Можно просто вкорячить исходник pcre старой версии – он небольшой по размеру.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>