2010-03-02 4 views
2

У меня есть этот простой кусок кода в C++:PCRECPP (PCRE) извлечь имя хоста из задачи URL кода

int main(void) 
    { 
     string text = "http://www.amazon.com"; 
     string a,b,c,d,e,f; 
     pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)[email protected])?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)"); 
     if(re.PartialMatch(text, &a,&b,&c,&d,&e,&f)) 
     { 
      std::cout << "match: " << f << "\n"; 
      // should print "www.amazon.com" 
     }else{ 
      std::cout << "no match. \n"; 
     }  
     return 0; 
    } 

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

EDIT: Благодаря Dingo, он отлично работает.
Другой вопрос, который у меня был, заключается в том, что результат был на шестом месте - «f».
Я отредактировал код выше, чтобы вы могли скопировать/вставить, если хотите.

ответ

1

Проблема заключается в том, что ваш код содержит ??(, который является триграфом в C++ для [. Вам необходимо отключить триграфы или сделать что-то, чтобы их разбить:

pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)[email protected])?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??" "([^#]+)?#?(\\w*)"); 
1

Пожалуйста соиЬ < < re.pattern() < < Endl; , чтобы дважды проверить, что все ваши двойные сокращения сделаны правильно (а также опубликовать результат).

Похоже

^((\ W +): ///)? ((\ W +):? (\ W +) @)? ([^/\ ?:] +) :? ? (\ d +) (/ [^ \ #; \ |?] +?) ([; \ |])?? ([?^\ #] +) \ ?? ([^ #] +) # ? (\ w *)

Имя хоста не будет возвращено из первой группы захвата, почему вы используете круглые скобки вокруг, например, \ w +, которые вы не хотите захватывать?