如何检查QString是否仅包含"不可见"字符?

时间:2015-08-27 16:42:59

标签: qt special-characters qstring

我想检查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;
}

2 个答案:

答案 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代码点或块的任何子集。