如何评估开关中的 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 转换为整数并将其可靠地与各种情况 >
、=
等进行比较?
你可以定义像字典这样的东西,我的意思是地图:
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;
A QChar
是 16 位 UTF-16 字符的包装器。
您可以使用 QChar::unicode()
检索 returns 和 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'é'
将始终被编译为值 0x00E9
.
的 char16_t
(~unsigned short
)
查看一堆代码,希望对其进行改进。
我遇到了这一点:
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 转换为整数并将其可靠地与各种情况 >
、=
等进行比较?
你可以定义像字典这样的东西,我的意思是地图:
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;
A QChar
是 16 位 UTF-16 字符的包装器。
您可以使用 QChar::unicode()
检索 returns 和 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'é'
将始终被编译为值 0x00E9
.
char16_t
(~unsigned short
)