2010-03-01 67 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*)"