符合数学表达式的正则态度

Regex to match mathematical expressions

本文关键字:态度 表达式      更新时间:2023-10-16

我有一个正则我打算用来"令牌"数学表达式,例如:

a + b + 1 + 2
int main() {
    string rxstrIdentifier = "\b[a-zA-Z]\w*\b";
    string rxstrConstant = "\b\d+\b";
    string rxstrRef = "(" + rxstrIdentifier + ")|(" + rxstrConstant + ")"; // identifier or constant
    const regex rxExpr = regex("^(" + rxstrRef + ")(.*)$"); // {x} [{+} {y}]*
    //const regex rxSubExpr = regex("^\s*([+])\s*(" + rxstrRef + ")(.*)$"); // {+} {x} [...]
    string test = "b + a + 1";
    cmatch res;
    regex_search(test.c_str(), res, rxExpr);
    cout << "operand: " << res[1] << endl;
    cout << "res: " << res[2] << endl;
    system("pause");
    return 0;
}

问题是操作数,RES在示例中仅给出B。我期望

operand: b
res: + a + 1

曾经在另一个类似的正时正时工作...

const regex Parser::rxExpr = regex("^(\w+)((\s*([+])\s*(\w+))*)$"); // {x} [{+} {y}]*
const regex Parser::rxSubExpr = regex("^\s*([+])\s*(\w+)(.*)$"); // {+} {x} [...]

您的regexes似乎不允许字符串中的空格。 b匹配字边界,但边界的宽度为零,因此没有什么可以消耗令牌之间的空间。

使用(?:模式)组:

string rxstrRef = "(?:" + rxstrIdentifier + ")|(?:" + rxstrConstant + ")"; // identifier or constant

这消除了对搜索结果的影响