Как я могу оценить объект QChar в коммутаторе? - PullRequest
1 голос
/ 21 января 2020

Проходя через кучу кода, пытаясь улучшить его.

Я сталкивался с этим битом:

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 в целое число и надежно сравнить его с различными случаями >, = et c?

Ответы [ 2 ]

2 голосов
/ 21 января 2020

вы можете определить что-то вроде словаря, а я имею в виду карту:

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;
1 голос
/ 21 января 2020

A QChar - это оболочка для 16-битного символа UTF-16.

Вы можете получить значение, используя QChar::unicode(), которое возвращает unsigned short.

. Вы можете напишите свой переключатель следующим образом:

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

Будьте осторожны с вашими операторами case, так как если вы используете 8-битные литералы символов, они могут работать не так, как ожидалось.

Например é может быть 0xE9 (Latin-1, UTF16) или 0x82 (CP437) или даже 0xC3 0xA9 (UTF-8, который не будет компилироваться, так как для него требуется 2 символа).

Решением является использование литералов UTF-16, которые являются частью C ++ начиная с C ++ 11. Например, u'é' всегда будет компилироваться как char16_t (~ unsigned short) со значением 0x00E9.

...