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++.

★★★★★

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

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

ox55ff ★★★★★
()

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

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

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

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

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

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

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

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

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

Спасибо, экранирование помогло.

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

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

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

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

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