一个QString
是由UTF-16编码单元,令人困惑的是名为QChar
,而不是字符。一个字符可以用一个或多个Unicode代码点表示。一般来说,您需要遍历字符串并处理所有代理对,以便通过QChar::surrogateToUcs4
获取Unicode代码点(UTF-32/UCS-4)。然后你得到这些QChar::category
,并检查它们是什么。尽管如此,这可以用仍然在QChar
s上运行的正则表达式表示。
值得庆幸的是,所有非打印代码点都以UTF-16的单个代码单元表示,因此通过单独查看每个QChar
,您可以知道它是什么。
而且,QChar::isSpace()
知道所有这些,并且QRegExp
与\s
类别下的这些字符匹配。
因此,支票简化为:
bool isWhiteSpace(const QString & str)
{
return QRegExp("\\s*").exactMatch(str);
}
这将会是保留正则表达式作为一个类的成员是有用的,因为它的构造从一个图案是昂贵:
// C++11, Qt 5
class C {
QRegExp m_whiteSpace { QStringLiteral("\\s*") };
public:
bool isWhiteSpace(const QString & str) const {
return m_whiteSpace.exactMatch(str);
}
};
// C++98, Qt 5
class C {
QRegExp m_whiteSpace;
public:
C() : m_whiteSpace(QStringLiteral("\\s*")) {}
bool isWhiteSpace(const QString & str) const {
return m_whiteSpace.exactMatch(str);
}
};
// C++98, Qt 4
class C {
QRegExp m_whiteSpace;
public:
C() : m_whiteSpace(QLatin1String("\\s*")) {}
bool isWhiteSpace(const QString & str) const {
return m_whiteSpace.exactMatch(str);
}
};
QString可能包含unicode
不可能。请问。总是。这就是QString
。它是UTF-16代码单元的容器。在Unicode标准中定义的解释中,它们“是”Unicode。拉丁语-1块与天梵里块相比,不逊色于Unicode。
你的意思可能是该字符串的内容不限于任何Unicode代码点或块的子集。
标志着我这个作为答案,因为我刚刚发现我可以这样做正则表达式'静态常量QRegExp blankRegExp(“\\ S”);'然后检查'返回!str.contains(blankRegExp);' - 我无法得到'm_whiteSpace'的声明。 – Thalia
@Thalia这是C++ 11的值初始化语法。您可能需要将其移回C++ 98并使用初始化程序列表。由于您确实使用了一种不会挖掘线程安全性的较老的C++编译器,因此一旦您从其他线程开始使用它,'static const QRegExp'就是一个绝好的方法。作为一种习惯,我会尽量避免这些。 –