javascript - 将正则表达式模式从 Javascript 转换为 PCRE (perl)

标签 javascript c++ regex pcre

这是我的 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/

相关文章:

javascript - 传递给 __defineGetter__ 的函数中 "this"的值是多少

c++ - 将 csv 读入数组

Ruby Regex 仅捕获最后一个匹配组的值

javascript - PHP (web) 导出到 power point (pptx)

javascript - Bootstrap 模式隐藏方法 - 无事件静默?

javascript - Nodejs 代码执行中的 UnhandledPromiseRejectionWarning

c++ - 如何在 C++ 中处理中断信号和调用析构函数?

c++ - 构造函数采用参数时的GTest夹具?

c++ - 解析 HTTP 摘要认证的正确正则表达式模式是什么?

javascript - 我的主要语法检查器条件是未通过所有字符串组合