1

浏览了一堆代码,希望对其进行改进。

我遇到了这一点:

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 变成一个整数并可靠地将它与各种情况>等进行比较=

4

2 回答 2

3

AQChar是 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 个字符)。

解决方案是使用自 C++11 以来作为 C++ 一部分的 UTF-16 文字。例如u'é'将始终编译为char16_t(~ unsigned short) 的 value 0x00E9

于 2020-01-21T10:58:08.310 回答
2

你可以定义一个字典之类的东西,我的意思是一个地图:

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;
于 2020-01-21T09:54:40.967 回答