QRegularExpression和使用反斜杠的规则

问题描述 投票:2回答:1

documentation,它说

请注意,由于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
c++ qt qt5
1个回答
4
投票

所有主要编译器(gcc,clang,msvc,icc)都抱怨\d默认是一个无法识别的转义序列(即默认情况下所有这些警告都已启用,至少在最新版本中是这样)。

他们所做的就是对待\d就像你只是输入d一样。

因此,在你的情况下,最后的字符串将是"d",而"abc123 def"又是一个有效的正则表达式,实际上它匹配d,因为那里有一个qazxswpoi。

请注意,这与Qt无关:它不解析C ++也不会抱怨转义序列;这是编译器的工作。 Qt看到的是编译器最终从源代码构造的任何字符串。

为避免此类问题,请不要忽略警告(如果禁用警告则重新启用它们)。

© www.soinside.com 2019 - 2024. All rights reserved.