QRegularExpression и правило использования обратной косой черты - PullRequest
2 голосов
/ 17 марта 2019

В документации , указано

Обратите внимание, что из-за правил литеральных строк в C ++ вы должны экранировать все обратная косая черта внутри строки шаблона с другой обратной косой чертой:

Но я сознательно проигнорировал обратную косую черту, и код работает даже без предупреждения. Единственное, что я получаю, это редактор Qt Creator unknown escape sequence '\d'.

Мой вопрос заключается в том, каковы последствия игнорирования обратной косой черты в регулярных выражениях (, т. Е. , хотя я не буду этого делать в своих приложениях).

#include <QCoreApplication>
#include <QRegularExpression>
#include <QDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QRegularExpression regex("\d"); \\ the correct way is "\\d"

    // Validate the regular exression. 
    if(regex.isValid()){
        qDebug() << "The regular expression is VALID.";
        QRegularExpressionMatch match = regex.match("abc123 def");
        bool hasMatch = match.hasMatch(); 
        qDebug() << hasMatch;
    }else {
        qDebug() << "The regular expression INVALID.";
    }

    return a.exec();
}

Выход

The regular expression is VALID.
true

1 Ответ

4 голосов
/ 17 марта 2019

Все основные компиляторы (gcc, clang, msvc, icc) жалуются на то, что \d является нераспознанной escape-последовательностью по умолчанию (т.е. предупреждение включено по умолчанию во всех из них, по крайней мере, в их последних версиях).

Все они обрабатывают \d, как если бы вы просто набрали d.

Следовательно, в вашем случае конечная строка будет "d", что, в свою очередь, является действительнымрегулярное выражение, и оно действительно соответствует "abc123 def", потому что там есть d.

Обратите внимание, что это не имеет ничего общего с Qt: оно не анализирует C ++ и не может пожаловаться на escape-последовательности;это работа компилятора.Qt видит любую строку, которую компилятор в итоге построил из исходного кода.

Чтобы избежать подобных проблем, пожалуйста, не игнорируйте предупреждения (и включите их снова, если вы их отключили).

...