通过一堆代码,希望改进它。
我遇到了这一点:
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转换为整数,并将其与>、=等各种情况进行可靠的比较?
发布于 2020-01-21 18:58:08
QChar是16位UTF-16字符的包装器。
您可以使用返回unsigned short的QChar::unicode()来检索值。
你可以这样写你的开关:
QChar c;
switch (c.unicode()) {
case u'a':
...
}使用case语句时要小心,因为如果使用8位字符文字,它可能不会像预期的那样工作。
例如,é可能是0xE9 (拉丁语-1,UTF16),或者0x82 (CP437),甚至是0xC3 0xA9 (UTF-8,它不会编译,因为它需要2个字符)。
解决方案是使用UTF-16字面量,这些字面量从C++11开始就是C++的一部分。例如,u'é'总是被编译为值为0x00E9的char16_t (~unsigned short)。
发布于 2020-01-21 17:54:41
你可以定义字典之类的东西,我指的是Map:
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;https://stackoverflow.com/questions/59838236
复制相似问题