簡體   English   中英

如何評估開關中的 QChar 對象?

[英]How can I evaluate a QChar object in a switch?

瀏覽一堆代碼,希望對其進行改進。

我遇到了這一點:

if (c == '<' || c == '>') {
    pattern.append("\\b");
} else if (c == 'a') {
    pattern.append("[a-zA-Z]");
} else if (c == 'A') {
    pattern.append("[^a-zA-Z]");
} else if (c == 'h') {
    pattern.append("[A-Za-z_]");
} else if (c == 'H') {
    pattern.append("[^A-Za-z_]");
} else if (c == 'c' || c == 'C') {
    ignorecase = (c == 'c');
} else if (c == 'l') {
    pattern.append("[a-z]");
} else if (c == 'L') {
    pattern.append("[^a-z]");
} else if (c == 'o') {
    pattern.append("[0-7]");
} else if (c == 'O') {
    pattern.append("[^0-7]");
} else if (c == 'u') {
    pattern.append("[A-Z]");
} else if (c == 'U') {
    pattern.append("[^A-Z]");
} else if (c == 'x') {
    pattern.append("[0-9A-Fa-f]");
} else if (c == 'X') {
    pattern.append("[^0-9A-Fa-f]");
} else if (c == '=') {
    pattern.append("?");
} else {
    pattern.append('\\');
    pattern.append(c);
}

如果c是一個字符,這將很容易變成一個開關。 c是一個 QChar; 我應該如何將 QChar 轉換為整數並將其與各種情況可靠地進行比較>=等?

QChar是 16 位 UTF-16 字符的包裝器。

您可以使用返回unsigned shortQChar::unicode()檢索值。

你可以這樣寫你的開關:

QChar c;
switch (c.unicode()) {
    case u'a':
    ...
}

小心你的case語句,就好像你使用 8 位字符文字一樣,它可能無法按預期工作。

例如é可能是0xE9 (Latin-1,UTF16)或0x82 (CP437)甚至0xC3 0xA9 (UTF-8,因為它需要 2 個字符而無法編譯)。

解決方案是使用自 C++11 以來作為 C++ 一部分的 UTF-16 文字。 例如u'é'將始終被編譯為值為0x00E9char16_t (~ unsigned short )。

你可以定義像字典這樣的東西,我的意思是地圖:

int main(int argc, char* argv[])
{
    QMap<QChar, QString> myMap{{'a', "[a-zA-Z]"},{'X', "[^0-9A-Fa-f]"}, {'h', "[A-Za-z_]"}};

    QString regex{};
    regex.append(myMap.value('a', ""));
    regex.append(myMap.value('5', ""));
    regex.append(myMap.value('X', ""));
    qDebug() <<  "myRegex: " << regex;
    return 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM