1. 问题背景
为了匹配到关键字并实现语法高亮,但匹配关键字时,可能会匹配到非预期的单词,如匹配 int 关键字, 可能会匹配到其他单词如 point, interface 等等。
为了避免这种情况,能想到使用关键字前后加空格的办法来解决,但此种方式有缺陷,如代码中会出现 vector<int> 时,这种情况前后无空格,经过尝试,建议使用正则表达式类QRegularExpression。
2. QRegEx 和 QRegularExpression 区别
Qt 4 引入 QRegEx
Qt 5.0 引入 QRegularExpression,相较 QRegEx 修复了一些缺陷,且更高效。所以建议使用 QRegularExpression。
3. 代码实现
整词匹配需要使用 \b
,正则表达式中 \b
用于匹配一个单词的开头或者结尾。
"\bWord\b"
注意:仅写 \b
在 C++ 中不够,由于 \
字符需要转义 所以应写成:
"\\bWord\\b"
定义需要匹配的关键字
QVector<QString> m_keywords = {
"int", "double", /*.....*/};
替换并标注高亮
QString output = input;
// ...
for (const QString & str : m_keywords)
{
QRegularExpression regex("\\b" + str + "\\b");
if (output.contains(regex)
{
output.replace(regex, "<font color='#569cd6'>" + str + "</font>");
}
}