PCRECPP(pcre)从url代码问题中提取主机名

时间:2010-03-02 00:05:11

标签: c++ regex pcre

我在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的人都可以看看这个我感激不尽。

编辑: 感谢Dingo,它效果很好。
我遇到的另一个问题是结果是在第六位 - “f”。
我编辑了上面的代码,以便您可以根据需要进行复制/粘贴。

2 个答案:

答案 0 :(得分:1)

请做 cout&lt;&lt; re.pattern()&lt;&lt; ENDL; 仔细检查所有双重削减是否正确完成(并发布结果)。

看起来像

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

主机名不会从第一个捕获组返回,为什么你使用括号,例如\ w +你不想捕获?

答案 1 :(得分:1)

问题是您的代码包含??(,这是[的C ++中的三字母。你需要禁用三字母或做一些事情来解决它们:

pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??" "([^#]+)?#?(\\w*)"); 
相关问题