C POSIX ERE без обратных ссылок - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужно включить в мой код C компилятор / исполнитель регулярных выражений POSIX ERE.Я остановился на собственной библиотеке regex.h, которая выглядит примерно так:

#include <regex.h>

bool
match_posix_regex(const char *pattern, const char *str){
    regex_t regex;
    int reti;

    reti = regcomp(&regex, pattern, REG_EXTENDED);
    if(reti){
        printf("Could not compile the regex\n");
        return false;
    }

    reti = regexec(&regex, str, 0, NULL, 0);
    if(!reti){
        return true;
    }

    else if (reti == REG_NOMATCH){
        return false;
    }

    else{
        printf("ERROR in regex execution\n");
        return false;
    }
}

До меня дошло, что эта реализация включает в себя поддержку обратных ссылок.Насколько я понимаю, стандарты POSIX ERE не поддерживают обратные ссылки, однако многие реализации этих стандартов поддерживают.Глядя на regex.h docs , я не вижу возможности отключить эту функцию.

Я не хочу включать поддержку обратных ссылок, поскольку это не так.включены в стандарты, и, кроме того, это может привести к катастрофическому откату, как описано здесь .

Есть ли способ, которым я могу скомпилировать и запустить регулярное выражение в C, которое соответствует стандартам POSIX ERE и включает ли не обратную ссылку в качестве функции?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я просто хотел указать на решение, которое нашел.Существует реализация POSIX ERE, которая не поддерживает обратные ссылки.Вы можете открыть этот интерфейс, включив макрос тестирования функции _GNU_SOURCE.Это позволяет вам скомпилировать регулярное выражение с RE_SYNTAX_POSIX_MINIMAL_EXTENDED.Я нашел это документально здесь .Затем вы можете использовать функцию re_compile_pattern .

Я знаю, что это может вызвать проблемы с переносимостью, но я считаю, что это следует понимать в большинстве систем, и проблема переносимости не была проблемой в моем случае.

0 голосов
/ 13 декабря 2018

Хотя регулярные выражения ERE не являются обычным языком (из-за совпадения уровней в скобках), этот аспект не влияет на кавычки, поэтому должна быть возможность написать довольно простое регулярное выражение, так что, если строка соответствует ему, либо она является допустимойERE без обратных ссылок или других расширений, или он имеет несоответствующие уровни скобок.Для этого нужно обращаться с круглыми скобками как с обычными символами.Большая часть работы будет писать регулярное выражение для правильного выражения в скобках.Затем сопоставьте свои входные строки с этим фиксированным регулярным выражением, прежде чем пытаться их скомпилировать.

Я думаю, что следующее правильное регулярное выражение для выражений в скобках с аннотациями под частями:

\[^?]?(\[\.([^.]|\.[^]])+\.]|\[=([^]=]|=[^]])+=]|\[:([^]:]|:[^]])+:]|[^]])*]
       ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^
       collating symbol      equivalence class   character class     char

AТогда псевдо-ERE:

($bracket|[^[\]|\[[.(\)*+?{|^$])*

, где $bracket - это приведенное выше регулярное выражение для скобок.

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