这个问题好像不是简单的用正则表达式能解决的。如果自己写程序,一百行的代码不一定能解决直觉使用Stack处理括号问题

解决方案 »

  1.   

    使用编译的语法分析要简单一些
    E->E+T|T|0
    T->T*F|F|0
    F->id|(E)|0
    使用几个类就可以了
      

  2.   

    以前用过一个MathExpression的类(非标准类),你可以google一下试试看
      

  3.   

    有一个投机取巧的方法,你可以将输入交给现成的算术表达式包处理,看看有没有出错。
    我用过一个算术表达式包JEP,下载下来后可用如下方法使用:
    JEP parser = new JEP();
    parser.parse(表达式);
    parser.getErrorInfo(); // 调用该函数看看有没有出错
      

  4.   

    JEP该可以
    http://www.singularsys.com/jep/用编译原理中的递归下降分析算法自己写也可以,这个算法不复杂,可看看书我这有个整型计算器,C代码的,改成JAVA很容易,要加小数支持就麻烦点了,给你参考/* Simple integer arithmetic calculator
       according to the EBNF:    <exp> -> <term> { <addop> <term> }
    <addop> -> + | -
    <term> -> <factor> { <mulop> <factor> }
    <mulop> -> *
    <factor> -> ( <exp> ) | Number    Inputs a line of text from stdin
    Outputs "Error" or the result.
    */
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>char token; /*global token variable *//* function prototypes for recursive calls */
    int exp(void);
    int term(void);
    int factor(void);void error(void)
    {
    fprintf(stderr, "Error\n");
    exit(1);
    }void match( char expectedToken )
    {
    if(token == expectedToken) token = getchar();
    else error();
    }main()
    {
    int result;
    token = getchar(); /* load token with first charactor for lookahead */ result = exp();
    if(token == '\n') /*check for end of line */
    printf("Result = %d\n", result);
    else error(); /* extraneous chars on line */
    return 0;
    }int exp(void)
    {
    int temp = term();
    while( (token == '+') || (token == '-') )
    switch(token)
    {
    case '+':
    match('+');
    temp += term();
    break;
    case '-':
    match('-');
    temp -= term();
    break;
    } return temp;
    }int term(void)
    {
    int temp = factor();
    while(token == '*')
    {
    match('*');
    temp *= factor();
    } return temp;
    }int factor(void)
    {
    int temp;
    if(token == '(')
    {
    match('(');
    temp = exp();
    match(')');
    }
    else if(isdigit(token))
    {
    ungetc(token, stdin);
    scanf("%d", &temp);
    token = getchar();
    }
    else error();
    return temp;
    }