我在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”。
我编辑了上面的代码,以便您可以根据需要进行复制/粘贴。
答案 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*)");