这是我的 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;
}
谢谢。
最佳答案
不需要转换它,您唯一需要注意的是转义和/分隔符。
请注意,您可能不想在此处使用正则表达式。或者至少……不是直接这样。有很多 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";
}
关于javascript - 将正则表达式模式从 Javascript 转换为 PCRE (perl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359721/