2012-11-01 56 views
0

我有一个正则表达式我打算用它来“标记化”的数学表达式所示:正则表达式匹配的数学表达式

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

可能我建议而实现真正的解析器,而不是一组正则表达式的。如果你进一步扩展你的项目,真正的解析器将不会很难维护。 –

+0

这就是我的建议,但我觉得球队不喜欢它。它是一个学校项目......所以我认为它现在也可以尝试正则表达式...... –

+0

有没有可能让你试图标记的字符串的复杂性增加?因为如果是这样,请尽早转移到解析器。复杂的正则表达式往往不是快速或可维护的;那里有许多词法分析器和解析器生成器,它们允许这两种情况。 – Rook

回答

1

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

1

使用(?:图案)组:

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

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