如何检查 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 ,并检查它们是什么。不过,这可以用仍然在 QChars 上运行的正则表达式来表示。

幸运的是,所有非打印代码点都表示为 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 或制表符

时才可以使用