2

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

4

2 回答 2

1

请做 cout << re.pattern() << endl; 仔细检查所有双斜线是否正确完成(并发布结果)。

好像

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

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

于 2010-03-02T00:16:39.147 回答
1

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

pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??" "([^#]+)?#?(\\w*)"); 
于 2010-03-02T01:30:08.427 回答