2010-03-02 59 views
2

提取主機名我有這樣的一段簡單的代碼在C++:PCRECPP(PCRE)從URL編碼問題

int main(void) 
    { 
     string text = "http://www.amazon.com"; 
     string a,b,c,d,e,f; 
     pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)[email protected])?([^\\/\\?:]+):?(\\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」。
我編輯了上面的代碼,以便您可以根據需要複製/粘貼。

回答

1

問題是您的代碼包含??(這是C++中trigraph的[。你要麼需要禁用trigraphs,要麼做一些事情來打破它們:

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

請做 cout < < re.pattern()< < endl; 來仔細檢查你所有的雙斜槓是否正確完成(並且發佈結果)。

貌似

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

主機名不會從第一個捕獲組返回,爲什麼你使用括號作爲例子\ w +而你不想捕獲?