【问题标题】:PCRECPP (pcre) extract hostname from url code problemPCRECPP (pcre) 从 url 代码问题中提取主机名
【发布时间】:2011-01-22 12:52:09
【问题描述】:

我有一段简单的 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”。
我编辑了上面的代码,因此您可以根据需要复制/粘贴。

【问题讨论】:

    标签: c++ regex pcre


    【解决方案1】:

    请做 cout

    看起来像

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

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

    【讨论】:

      【解决方案2】:

      问题在于您的代码包含??(,它是[ 的C++ 三元组。你要么需要禁用三元组,要么做一些事情来分解它们,比如:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-31
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        相关资源
        最近更新 更多