2015-10-04 81 views
-3

我正在嘗試查找字符串數組中的URL。正則表達式查找URL

這是我的代碼:

if((reti = regcomp(&reg, "/^(https?:\/\/)?([\w\.]+)\.([a-z]{2,6}\.?)(\/[\w\.]*)*\/?$/", 0)) == 0) 
{ 
    for(i = 0; i < argc; ++i) 
    { 
     cout << argv[i] << endl; 
     cout << "lllll" << endl; 
     reti = regexec(&reg, argv[i], 0, NULL, 0); 
     if(!reti) 
     { 
      regfree(&reg); 
      return static_cast<string>(argv[i]); 
     } 

    } 


}else 
{ 

    cerr << "Cannot compile regex" << endl; 
    exit(1); 
} 
regfree(&reg); 

但它無法找到URL,可能有人解釋我是哪裏錯了嗎?

+0

嗚!這是一個正則表達式!你可以在這裏看到(https://regex101.com/r/gZ0kE2/2),但是我們不能做太多的事情,但是直到你給我們一些樣本數據。請將它粘貼到OP中。 –

+0

看着你的代碼,沒有辦法編譯正確,因爲你使用'regex.h'頭,它不需要'/'作爲分隔符。此外,您需要在字符串文字中將\ \加倍,否則,正則表達式引擎不會看到它。另外,'\ w'不適用於所有使用POSIX regex實現的系統。我無法理解爲什麼你接受下面的答案。 – nhahtdh

回答

1

試試這個:

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ 

說明:

首先,它會搜索與尖號的行的開頭。

第一個捕獲組允許URL以「http://」,「https://」開頭,或者都不是。 s之後的問號允許具有http或https的URL。爲了使整個組成爲可選的,最後還有一個問號。

接下來是域名:一個或多個數字,字母,點或連字符,後面跟着另一個點,然後是兩個到六個字母或點。

以下部分處理可選文件和目錄。在組內部,我們希望匹配任意數量的正斜槓,字母,數字,下劃線,空格,點或連字符。並指出該組可以根據需要多次匹配,從而允許多個目錄與最後一個文件一起匹配。

我使用了星號而不是問號,因爲星號表示零或多個,而不是零個或一個。如果在那裏使用問號,則只能有一個文件/目錄能夠匹配。

然後匹配尾部斜線,但它可以是可選的。最後,我們以行結束而結束。

Reference