1

这是我的 javascript 正则表达式模式:

    url = "http://www.amazon.com/gp";    
    hostname = /^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)/.exec(url) || [];
// would return "www.amazon.com"
  • 上面的正则表达式从给定的 url 中提取主机名。我需要这条线使用 pcre (c++) 工作。如您所见,我已经在每个“\”中添加了另一个“\”,但它仍然不起作用。

我需要做哪些额外的更改才能使其在 pcre 代码而不是 javascript 中工作?或者也许这是不可能的,我需要构建全新的模式以使其在 pcre 中工作?

这是我的代码的简单版本:

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

谢谢。

4

2 回答 2

3

无需转换它,您唯一需要注意的是转义和 / 分隔符。

请注意,正则表达式可能不是您想在此处使用的。或者至少......不是直接这样。有很多 url 解析库更适合这项任务。例如HTParse

您的 C++ 代码应该可以工作,但您的正则表达式有很多可选组,因此很难确定主机名最终会在哪个组中。

尽管可能很老套,但我的编辑适用于此输入

string text = "http://www.amazon.com";
string tmp;
string hostname;
pcrecpp::RE re("^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)");
if(re.PartialMatch(text, &tmp, &tmp, &tmp, &tmp, &tmp, &hostname))
{
    std::cout << "match: " << hostname << "\n";
}else{
    std::cout << "no match. \n";
}
于 2010-03-01T22:57:38.957 回答
1
"^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)"
于 2010-03-01T23:06:06.123 回答