在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
所有主要编译器(gcc,clang,msvc,icc)都抱怨\d
默认是一个无法识别的转义序列(即默认情况下所有这些警告都已启用,至少在最新版本中是这样)。
他们所做的就是对待\d
就像你只是输入d
一样。
因此,在你的情况下,最后的字符串将是"d"
,而"abc123 def"
又是一个有效的正则表达式,实际上它匹配d
,因为那里有一个qazxswpoi。
请注意,这与Qt无关:它不解析C ++也不会抱怨转义序列;这是编译器的工作。 Qt看到的是编译器最终从源代码构造的任何字符串。
为避免此类问题,请不要忽略警告(如果禁用警告则重新启用它们)。