float x=0;
float y=0;
//正则的匹配规则
Pattern p = Pattern.compile("[1-9][0-9]*?x[+,-][1-9][0-9]*?y=[1-9][0-9]*?");

Scanner c=new Scanner(System.in);
System.out.println("请输入第一个方程:");
String num1=c.next();
System.out.println("请输入第二个方程:");
String num2=c.next();

if(p.matcher(num1).matches()&&p.matcher(num2).matches()){
float a1=new Float(num1.substring(0,num1.indexOf("x")));
        String op1=num1.substring(num1.indexOf("x")+1,num1.indexOf("x")+2);
        float b1=new Float(num1.substring(num1.indexOf("x")+2,num1.indexOf("y")));
        float c1=new Float(num1.substring(num1.indexOf("=")+1));
        
        float a2=new Float(num2.substring(0,num2.indexOf("x")));
        String op2=num2.substring(num2.indexOf("x")+1,num2.indexOf("x")+2);
        float b2=new Float(num2.substring(num2.indexOf("x")+2,num2.indexOf("y")));
        float c2=new Float(num2.substring(num2.indexOf("=")+1));
        
        
        if(op1.equals(op2)){
            x=(c1*b2-c2*b1)/(a1*b2-a2*b1);
        }else{
         x=(c1*b2+c2*b1)/(a1*b2+a2*b1);
        }
        
        if(op1.equals("-")){
     y=(c1-a1*x)/(-b1);
     }else{
     y=(c1-a1*x)/b1;
     }
        System.out.println("x="+x+"\n"+"y="+y);
           
}else{
System.out.println("方程格式错误!");
}

解决方案 »

  1.   

    第一你既然用了正则表达式,为什么获取每个数字参数都还用string的方法。直接用Matcher.group就可以啦,还有就是如果是小数呢?比如0.1X + 2.4Y = 4.4之类的呢?
    X和Y的顺序如果转换呢?
    存在空格也要考虑啊,正则要考虑很多东西的,不能只考虑你所以为的一些格式。
    x+y-3=0的这些奇怪的格式就处理不了
      

  2.   

    建议楼主不要使用正则··使用栈来存储,实现中缀表达式与后缀表达式的转换和运算就好··我这里写了一个·不过没考虑到2位数的··懒得改了··package com.cme.LanDian2;import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;/**
     * 输入一个式子,要求算出式的值
     */
    public class DengShi2 {
    public static void main(String[] args) {
    try {
    String houZhui = zhuanHuan("3+(20+1)*2");
    System.out.println(houZhui);
    int sum=jiSuanHouZhui(houZhui);
    System.out.println(sum);
    } catch (Exception e) {
    System.out.println("出错");
    e.printStackTrace();
    }
    } /** 中追表达式转换后缀表达式 */
    public static String zhuanHuan(String shiZi) throws Exception {
    String houZhui = "";// 存放后缀表达式的字符串
    List<Character> stack = new ArrayList<Character>();// 一个栈
    char[] cArray = shiZi.toCharArray();
    // 读取中缀表达式
    for (char c : cArray) {
    if (c >= '0' && c <= '9') {// 如果是数字,直接放入输出队列
    houZhui += c + "";
    } else if (c >= 42 && c <= 47) {// 如果是运算符
    if (stack.size() != 0) {// 不为空的时候才操作
    // 如果栈顶元素是左括号,直接进栈
    if (stack.get(stack.size() - 1) == '(') {
    stack.add(c);
    continue;
    } else {
    switch (isYouXian(c, stack.get(stack.size() - 1))) {// 比较运算符栈顶元素的运算符
    case 1:// 当大于的时候,入栈
    stack.add(c);
    continue;
    case 0:// 当等于的时候,出栈 case -1:// 当小于的时候,出栈,且进栈
    houZhui += stack.get(stack.size() - 1) + "";
    stack.remove(stack.size() - 1);
    stack.add(c);
    continue;
    default:// 当出现栈为空的情况下就直接进栈
    break;
    }
    }
    } else {// 为空时,直接加入
    stack.add(c);
    }
    } else if (c == '(') {// 如果是左括号,进栈
    stack.add(c);
    } else {// 剩下的就是右括号了,读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号
    for (int i = stack.size() - 1; i >= 0; i--) {// 遍历栈内de内容,
    if (stack.get(i) != '(') {// 如果不是左括号,全部出栈
    houZhui += stack.get(i) + "";
    stack.remove(i);
    } else {// 如果是左括号,直接移除左括号
    stack.remove(i);
    break;
    }
    }
    }
    }
    // 最后全部出栈
    for (int i = stack.size() - 1; i >= 0; i--) {
    houZhui += stack.get(i);
    stack.remove(i);
    }
    return houZhui;
    } /** 后缀表达式的计算 */
    public static int jiSuanHouZhui(String houZhui) {
    /*
     * 运用后缀表达式进行计算的具体做法: ·建立一个栈S
     * ·从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符
     * Y”的形式计算机出结果,再压加栈S中 ·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束
     */
    int sum = 0;
    char[] cArray = houZhui.toCharArray();
    List<Integer> stack = new ArrayList<Integer>();
    int first, second;
    for (char c : cArray) {
    if (c >= '0' && c <= '9') {// 如果是数字,直接如栈
    stack.add((int) (c - '0'));
    } else {// 如果是运算符
    first = stack.get(stack.size() - 1);
    stack.remove(stack.size() - 1);// 出栈两个
    second =stack.get(stack.size() - 1);
    stack.remove( stack.size() - 1);// 出栈两个
    switch (c) {// 计算
    case '+':
    sum = second + first;
    break;
    case '-':
    sum = second - first;
    break;
    case '*':
    sum = second * first;
    break;
    case '/':
    sum = second / first;
    break;
    default:
    break;
    }
    // 将运算得到的值入栈*
    stack.add(sum);
    }
    }
    return sum;
    } /** 判断运算符优先级的方法,返回运算符1是否优先于运算符2,优先的话就返回1,相等的话就返回0,不优先于就返回0 */
    public static int isYouXian(char yunSuanFu1, char yunSuanFu2) {
    int flag = 0;
    if ((yunSuanFu1 == 42 && yunSuanFu2 == 47)
    || (yunSuanFu1 == 47 && yunSuanFu2 == 42)) {// 如果是乘除
    flag = 0;
    } else if ((yunSuanFu1 == 45 && yunSuanFu2 == 43)
    || (yunSuanFu1 == 43 && yunSuanFu2 == 45)
    || yunSuanFu1 == yunSuanFu2) {// 如果是加减
    flag = 0;
    } else if ((yunSuanFu1 == 42 || yunSuanFu1 == 47)
    && (yunSuanFu2 == 43 || yunSuanFu2 == 45)) {// 如果是乘除与加减
    flag = 1;
    } else {
    flag = -1;
    }
    return flag;
    }
    }
      

  3.   


    对于正则不是很熟,所以才发出来集思广益。小数的情况考虑到了,我用的是float类型。因为是初步的版本,所以有很多的局限性,不是让你们改错。是希望你们能加以改造~~进一步完善
      

  4.   

    我觉得这些都不用去考虑,抽象出来,一个等式对应的就是三个数,直接抽象出矩阵,这样子就是AX=B的问题了,|A|=0,就说明不能称为n元一次方程,挡掉。X=BA-1.就是求矩阵的逆和矩阵的乘法了。这个http://hi.baidu.com/hein_lgs/blog/item/50b7e72dcd2040321f30899a.html里面的程序都有了。可以参考下