PCRECPP (pcre) извлекает имя хоста из проблемы с кодом URL - PullRequest
2 голосов
/ 02 марта 2010

У меня есть этот простой кусок кода на C ++:

int main(void)
    {
        string text = "http://www.amazon.com";
        string a,b,c,d,e,f;
        pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\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».
Я отредактировал код выше, чтобы вы могли копировать / вставлять, если хотите.

Ответы [ 2 ]

1 голос
/ 02 марта 2010

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

pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??" "([^#]+)?#?(\\w*)"); 
1 голос
/ 02 марта 2010

Пожалуйста, сделайте cout << re.pattern () << endl; перепроверить, что все ваши двойные слэши выполнены правильно (а также опубликовать результат). </p>

выглядит как

^ ((\ W +): ///?) ((\ W +):? (\ W +) @)? ([^ / \ ?:] +):? (\ D +) (/ ? [^ \ #,? \ |] +) (??? [; \ |]) ([? ^ \ #] +) \ ?? ([^ #] +) # (\ ш *)

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

...