正则表达式匹配数学表达式

时间:2012-11-01 13:59:55

标签: c++ regex visual-c++

我有一个正则表达式,我打算使用“标记”一个数学表达式,如:

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} [...]

2 个答案:

答案 0 :(得分:1)

您的正则表达式似乎不允许字符串中的空格。 \b匹配字边界,但边界的宽度为零,因此没有消耗标记之间的空格。

答案 1 :(得分:1)

使用(?:pattern)组:

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

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