我如何检查QString是否只包含“不可见”字符?

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

我想象一个正则表达式可能会起作用,但我不知道如何创建这样的正则表达式。

我如何检查QString是否只包含“不可见”字符? (空间, nrt ...)

我的“蛮力”尝试

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;
}

QString由UTF-16编码单元组成,令人困惑地命名为QChar ,而不是字符。 一个字符可以用一个或多个Unicode代码点表示。 一般来说,您需要迭代字符串并处理所有代理对,以通过QChar::surrogateToUcs4获取Unicode代码点(UTF-32 / UCS-4)。 然后你得到这些QChar::category ,并检查它们是什么。 尽管如此,这仍然可以用仍然在QChar运行的正则表达式来表示。

值得庆幸的是,所有非打印代码点均以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。 拉丁语-1块与天梵里块相比,不逊色于Unicode。

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


尝试这种方法

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

请注意,只有在您的意思是“不可打印”是空格或制表符时才可以使用

链接地址: http://www.djcxy.com/p/60835.html

上一篇: How can I check if a QString contains only "invisible" characters?

下一篇: Can I use the invisible characters in an URL?