Нет необходимости преобразовывать его, единственное, о чем вам нужно позаботиться, это экранирование и / разделитель.
Обратите внимание, что регулярное выражение может быть не тем, что вы хотите использовать здесь. Или по крайней мере ... не так, как это прямо. Есть много библиотек разбора 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";
}