2010-03-01 99 views
1

這是我的JavaScript正則表達式模式:轉換從Javascript正則表達式模式PCRE(perl的)

url = "http://www.amazon.com/gp";  
    hostname = /^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)[email protected])?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)/.exec(url) || []; 
// would return "www.amazon.com" 
  • 上述正則表達式提取從指定網址的主機名。 我需要這條線來使用pcre(C++)。你可以看到,我已經爲每個'\'添加了另一個'\',但它仍然不起作用。

我需要做些什麼才能使其工作在pcre代碼而不是javascript?或者也許這是不可能的,我需要建立全新的模式,使其工作在pcre?

這是我的一個簡單的代碼版本:

int main(void) 
{ 
    string text = "http://www.amazon.com"; 
    string hostname; 
    pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)[email protected])?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)"); 
    if(re.PartialMatch(text, &hostname)) 
    { 
     std::cout << "match: " << hostname << "\n"; 
    }else{ 
     std::cout << "no match. \n"; 
    }  
    return 0; 
} 

感謝。

回答

3

沒有必要轉換它,唯一要注意的是轉義和/分隔符。

請注意,正則表達式可能不是您想要在此處使用的。或者至少...不直接這樣。有很多url解析庫很適合這個任務。例如,HTParse

您的C++代碼應該可以工作,但是您的正則表達式有很多可選組,因此很難確定主機名將以什麼組結束。

由於哈克,因爲它可能是,我的編輯工作這個輸入

string text = "http://www.amazon.com"; 
string tmp; 
string hostname; 
pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)[email protected])?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)"); 
if(re.PartialMatch(text, &tmp, &tmp, &tmp, &tmp, &tmp, &hostname)) 
{ 
    std::cout << "match: " << hostname << "\n"; 
}else{ 
    std::cout << "no match. \n"; 
} 
+0

我應該怎麼做了「/分隔符」? – shaimagz

+0

@BillyONeal:這是不正確的,在PCRE的C++版本中,你不需要分隔符。另外,您通常不必使用/作爲分隔符,大多數其他分隔符也可以使用。 – Wolph

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