LINUX.ORG.RU

Регулярка для анализа URL

 ,


0

1

Добрый день, ЛОР.

Задача: распарсить URL из кутешной программы. Регулярка взята из Приложения B к RFC 3986.

    QRegExp rUrl;
    rUrl.setPatternSyntax(QRegExp::RegExp2);
    rUrl.setPattern(
                "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?");
    if (!rUrl.isValid())
        qDebug() << "Invalid pattern";

Программа пишет «Invalid pattern». Может, я всё-таки с синтаксисом промахнулся?

Upd: всем спасибо. Банально забыл удвоить обратную косую черту при внесении всего этого великолепия в текст на C++.

★★★★★

\?

Экранировать кто будет? Или используй строковые литералы из c++11 R"( тут текст )".

ox55ff ★★★ ()
Последнее исправление: ox55ff (всего исправлений: 2)

Попробуй ещё QRegularExpression вместо QRegExp, он мне помог, когда нужно было рулить жадностью.

ox55ff ★★★ ()
Ответ на: комментарий от ox55ff

Экранировать кто будет?

Точно, блин! Совсем забыл про бэкслеш.

Спасибо..

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 1)

1. В Qt5 используй QRegularExpression вместо QRegExp

2. А лучше вообще используй re2c, регулярка известна во время компиляции так что не хрен ее в рантайме компилять

3. В конце нет $ так что тест пройдет с любым мусором в конце строки

4. Вообще не стоит использовать регулярки в таком стиле. Лучше разбить урл на компоненты лексером с простыми регулярками, а потом провалидировать отдельные компоненты. Сложность регулярок снизится на порядок, что особенно актуально когда у тебя нет заранее подготовленного решения

annulen ★★★★★ ()
Ответ на: комментарий от annulen

По п.4 - ну собственно сначала я навелосипедил регулярку попроще, и потом разделял host и path руками (регулярка норовила выделить в хост всё до последнего слеша, насколько я понял, тут надо как раз разбираться с жадностью). Она работает, но код мне показался громоздким, и я подумал, что должен же быть какой-то каноничный вариант, нашёл это...

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Тогда лучше raw literal использовать, чтобы регулярка копипастилась из RFC без изменений. Опечатку увидеть - шансов практически ноль

annulen ★★★★★ ()
Ответ на: комментарий от Olegymous

Кстати, спасибо за идею.

Я как-то недооценил возможности этого класса, но оказалось, что он вытаскивает из URL все мои хотелки, включая имя пользователя (и даже пароль, который в том же RFC 3986 помечен как deprecated и вообще небезопасный).

Сократил программу.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.