Конвертировать шаблон регулярного выражения из Javascript в PCRE (perl) - PullRequest
1 голос
/ 02 марта 2010

Это мой шаблон регулярных выражений 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;
}

Спасибо.

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Нет необходимости преобразовывать его, единственное, о чем вам нужно позаботиться, это экранирование и / разделитель.

Обратите внимание, что регулярное выражение может быть не тем, что вы хотите использовать здесь. Или по крайней мере ... не так, как это прямо. Есть много библиотек разбора 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";
}
1 голос
/ 02 марта 2010
"^((\\w+):\\/\\/\\/?)?((\\w+):?(\\w+)?@)?([^\\/\\?:]+):?(\\d+)?(\\/?[^\\?#;\\|]+)?([;\\|])?([^\\?#]+)?\\??([^#]+)?#?(\\w*)"
...