Qt 如何检查QString是否只包含;无形的;角色?

Qt 如何检查QString是否只包含;无形的;角色?,qt,special-characters,qstring,Qt,Special Characters,Qstring,我想检查QString是否仅由不可打印或不可见的字符组成。QString可能包含unicode 我想正则表达式可以工作,但我不知道如何创建这样的正则表达式 如何检查QString是否只包含“不可见”字符?(空格,\n,\r,\t…) 我的“蛮力”尝试 QString是由UTF-16代码单元组成的,它们的名称令人费解,而不是字符。一个字符可以由一个或多个Unicode代码点表示。一般来说,您需要遍历字符串并处理所有代理项对,以通过QChar::代理项toucs4获得Unicode代码点(在UTF-

我想检查
QString
是否仅由不可打印或不可见的字符组成。
QString
可能包含unicode

我想正则表达式可以工作,但我不知道如何创建这样的正则表达式

如何检查
QString
是否只包含“不可见”字符?(空格,
\n
\r
\t
…)

我的“蛮力”尝试


QString
是由UTF-16代码单元组成的,它们的名称令人费解,而不是字符。一个字符可以由一个或多个Unicode代码点表示。一般来说,您需要遍历字符串并处理所有代理项对,以通过
QChar::代理项toucs4
获得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块的Unicode编码不低于Devanagari块

您的意思可能是字符串的内容不限于Unicode代码点或块的任何子集。

试试这种方法

bool checkIfEmpty(const QString contents) const
{
     if(contents.trimmed()=="") return true;
     else return false;
}

请注意,只有当您所说的“无可打印”是空格或制表符时,才可以使用此选项

我将此标记为答案,因为我刚刚发现我可以执行此regexp
静态常量QRegExp blankRegExp(\\S”)然后选中返回!str.contains(blankRegExp)-我无法获得
m_whiteSpace
的声明,因为您编写了它来构建。@Thalia这是C++11值初始化语法。您可能需要将其移植回C++98并使用初始值设定项列表。既然你使用的是一个不挖掘线程安全性的老C++编译器,那么<代码>静态const QRegExp < /代码>是一个可靠的方法,一旦你从其他线程开始使用它,它就会快速死亡。作为一种习惯,我会尽可能避免这些
bool checkIfEmpty(const QString contents) const
{
     if(contents.trimmed()=="") return true;
     else return false;
}