2015-08-27 22 views
2

我想检查一个QString是否仅由不可打印或不可见字符组成。 QString可能包含unicode ...如何检查QString是否只包含“不可见”字符?

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

如何检查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; 
} 

回答

1

一个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); 
} 

这将会是保留正则表达式作为一个类的成员是有用的,因为它的构造从一个图案是昂贵:

// 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代码点或块的子集。

+0

标志着我这个作为答案,因为我刚刚发现我可以这样做正则表达式'静态常量QRegExp blankRegExp(“\\ S”);'然后检查'返回!str.contains(blankRegExp);' - 我无法得到'm_whiteSpace'的声明。 – Thalia

+0

@Thalia这是C++ 11的值初始化语法。您可能需要将其移回C++ 98并使用初始化程序列表。由于您确实使用了一种不会挖掘线程安全性的较老的C++编译器,因此一旦您从其他线程开始使用它,'static const QRegExp'就是一个绝好的方法。作为一种习惯,我会尽量避免这些。 –

3

尝试这种方法

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

请注意,如果您的意思这可以只用“不打印”是空格或制表符

+0

另请参见:contents.trimmed()。isEmpty() –

相关问题