2013-03-02 3 views
3

Я хотел бы использовать регулярное выражение здесь:Почему это регулярное выражение не будет компилироваться?

https://tools.ietf.org/html/rfc3986#appendix-B

я пытаюсь скомпилировать его так:

#include <regex.h> 
... 
regex_t regexp; 
if((regcomp(&regexp, "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?", REG_EXTENDED)) != 0){ 
    return SOME_ERROR: 
} 

Но я застрял с возвратным значением regcomp:

REG_BADRPT 

Согласно man это средства:

Недопустимое использование операторов повторения, таких как использование * в качестве первого символа.

Аналогичный смысл в этом man:

?, * или + не предшествуют действительного регулярного выражение

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

+10

Вы не учли, [спасаясь] (http://en.wikipedia.org/wiki/String_literal#Escape_sequences) требуется в C++ строковых литералов ... Попробуйте напечатать вашу строку регулярных выражений и вы будете посмотрим, что я имею в виду. –

ответ

2

Как предложил Оли Чарлворт, вам необходимо избежать обратной косой черты \\ для вопросительных знаков \?. См. C++ escape sequences для получения дополнительной информации.

тестовая программа

#include <regex.h> 
#include <iostream> 

void test_regcomp(char *rx){ 
regex_t regexp; 
if((regcomp(&regexp, rx, REG_EXTENDED)) != 0){ 
    std::cout << "ERROR :" << rx <<"\n"; 
} 
else{ 
    std::cout << " OK :"<< rx <<"\n"; 
} 
} 

int main() 
{ 

    char *rx1 = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?" ; 
    char *rx2 = "^(([^:/\?#]+):)\?(//([^/\?#]*))\?([^\?#]*)(\\\?([^#]*))\?(#(.*))\?" ; 

    test_regcomp(rx1); 
    test_regcomp(rx2); 

    return 0; 
} 

выход

ERROR :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))? 
    OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 

\? в своем регулярном выражении является источником ошибки REG_BADRPT. Он преобразуется в ?. Если вы замените его на \\?, regcomp сможет скомпилировать ваше регулярное выражение.

"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?" 

    OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 
Смежные вопросы