Qt中QRegularExpression匹配加减表达式及运算符位置异常求助
问题解决
核心问题分析
- API误用:你调用的
lastCapturedIndex()是错误的,这个函数返回的是正则中最后一个捕获组的序号,并非运算符在字符串中的位置。要获取匹配位置,需使用capturedStart()方法。 - 正则逻辑错误:原
\\b[+-]的单词边界匹配逻辑不符合需求。\b仅匹配单词字符(数字、字母、下划线)与非单词字符的边界,当+/-处于两个数字之间时,两边都是单词字符,不存在\b,因此这个正则只会匹配开头的正负号(比如-12+3里的-),导致返回位置为0。
解决方案
1. 表达式合法性校验正则
先验证输入表达式是否合法,直接排除连续运算符等错误格式:
static QRegularExpression validRx("^[+-]?\\d+([+-]\\d+)+$");
^[+-]?:允许开头有一个可选的正负号\\d+:匹配至少一个数字([+-]\\d+)+:要求每个运算符后必须跟数字,且至少存在一组,杜绝连续运算符$:匹配字符串结尾,确保无多余无效字符
2. 提取合法运算符的正则
精准匹配位于两个数字之间的运算符,自动排除开头正负号和连续运算符:
static QRegularExpression opRx("(?<=\\d)[+-](?=\\d)");
(?<=\\d):反向预查,确保运算符前是数字(?=\\d):正向预查,确保运算符后是数字
修正后的完整代码
QString input = ui->labelAnswer->text(); // 示例值:"12+3" // 先校验表达式合法性 QRegularExpression validRx("^[+-]?\\d+([+-]\\d+)+$"); QRegularExpressionMatch validMatch = validRx.match(input); if (!validMatch.hasMatch()) { qDebug() << "表达式非法"; return; } // 提取所有合法运算符的位置 QRegularExpression opRx("(?<=\\d)[+-](?=\\d)"); QRegularExpressionMatchIterator it = opRx.globalMatch(input); while (it.hasNext()) { QRegularExpressionMatch match = it.next(); int opPos = match.capturedStart(); QChar op = match.captured().at(0); qDebug() << "运算符" << op << "的位置:" << opPos; }
效果说明
- 合法表达式(如
43+3、-12-32)会通过校验,并输出正确的运算符位置(比如12+3里的+位置为2) - 错误表达式(如
-12+-+23、+43+1-3)会被判定为非法,不会输出运算符位置
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

