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/

相关文章:

java - 提高基于正则表达式的替换性能

javascript - 正则表达式匹配大于 0 的数字,在括号内并且倒数第二个字符为字符串

javascript - JavaScript 中的条件错误处理

javascript - 使用 FBJS 中的 json 对象更改 HTML SELECT OPTION

c++ - 使用 C++ Boost.Test 组织单元测试?

C++,使用 Ctrl+C 携带存储语句的缓冲区

regex - Android 字符串数组 : move strings out of array for better visibility

javascript - 为什么当对象键是数字、连续且从0开始时,axios会将JSON对象转换为数组?

javascript - 这个 comment/*@cc_on!@*/0 在 javascript 的 if 语句中做什么?

堆栈分配对象的 C++ 虚拟析构函数内联