我想检查QString
是否仅由不可打印或不可见的字符组成。 QString
可以包含unicode ......
我想正则表达式可能有用,但我不知道如何创建这样的正则表达式。
如何检查QString
是否只包含"隐形"人物? (空格,\n
,\r
,\t
...)
我的"蛮力"尝试
bool checkIfEmpty(const QString &contents) const
{
for(QString::const_iterator itr(contents.begin()); itr != contents.end(); ++itr)
{
if(*itr != '\n' && *itr != '\r' && *itr != ' ' && *itr != '\t')
return false;
}
return true;
}
答案 0 :(得分:4)
尝试这种方法
bool checkIfEmpty(const QString contents) const
{
if(contents.trimmed()=="") return true;
else return false;
}
请注意,只有当您的意思是" no printable"是空格或制表符
答案 1 :(得分:2)
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标准中定义了解释。 Latin-1块的价值不亚于Devanagari块。
您的意思可能是字符串的内容不限于Unicode代码点或块的任何子集。