如何检查 QString 是否仅包含 "invisible" 个字符?
How can I check if a QString contains only "invisible" characters?
我想检查 QString
是否仅由不可打印或不可见的字符组成。 QString
可能包含 unicode...
我想正则表达式可能有用,但我不知道如何创建这样的正则表达式。
如何检查 QString
是否仅包含 "invisible" 个字符? (space, \n
, \r
, \t
...)
我的"brute force"试试
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;
}
A 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);
}
将正则表达式保留为 class 成员会很有用,因为从模式构建它的成本很高:
// 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);
}
};
The QString could contain unicode
不可以。做。总是。这就是 QString
的含义。它是 UTF-16 代码单元的容器。他们 "are" Unicode,在 Unicode 标准中定义了一种解释。 Latin-1 块的 Unicode 不亚于 Devanagari 块。
您的意思可能是字符串的内容不限于 Unicode 代码点或块的任何子集。
试试这个方法
bool checkIfEmpty(const QString contents) const
{
if(contents.trimmed()=="") return true;
else return false;
}
请注意,只有当您的 "no printable" 是 space 或制表符
时才可以使用
我想检查 QString
是否仅由不可打印或不可见的字符组成。 QString
可能包含 unicode...
我想正则表达式可能有用,但我不知道如何创建这样的正则表达式。
如何检查 QString
是否仅包含 "invisible" 个字符? (space, \n
, \r
, \t
...)
我的"brute force"试试
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;
}
A 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);
}
将正则表达式保留为 class 成员会很有用,因为从模式构建它的成本很高:
// 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);
}
};
The QString could contain unicode
不可以。做。总是。这就是 QString
的含义。它是 UTF-16 代码单元的容器。他们 "are" Unicode,在 Unicode 标准中定义了一种解释。 Latin-1 块的 Unicode 不亚于 Devanagari 块。
您的意思可能是字符串的内容不限于 Unicode 代码点或块的任何子集。
试试这个方法
bool checkIfEmpty(const QString contents) const
{
if(contents.trimmed()=="") return true;
else return false;
}
请注意,只有当您的 "no printable" 是 space 或制表符
时才可以使用