问题:Java程序从二次方程式中分解系数,例如
如果输入字符串是:

String str1;
str1 = "4x2-4x-42=0"

所以我需要从给定的输入字符串中拆分系数,并以
a = 4 b = -4 c = -42

我尝试了这个:
String equation = "ax2+bx-c=0";
String[] parts = equation.split("\\+|-|=");
for (int i = 0; i < parts.length - 2; i++) {
    String part = parts[i].toLowerCase();
    System.out.println(part.substring(0, part.indexOf("x")));
}
System.out.println(parts[2]);

但是我得到的输出为23x2和4x和4。
实际需要的输出是23 ,- 4 , 4

最佳答案

使用正则表达式,以下模式将起作用:

([+-]?\d+)[Xx]2\s*([+-]?\d+)[Xx]\s*([+-]?\d+)\s*=\s*0

这将匹配二次方并提取参数,让我们弄清楚它是如何工作的:
  • (...)这正在捕获组
  • [+-]?\d+与许多数字匹配,可以选择在前面加上+-
  • 这与“X”或“x”匹配的[Xx]
  • \s*匹配零个或多个空格

  • 所以
  • ([+-]?\d+)与参数“a”匹配
  • [Xx]2匹配“X2”或“x2”
  • \s*与可选的空白
  • 匹配
  • ([+-]?\d+)与参数“b”匹配
  • [Xx]匹配“X”或“x”
  • \s*与可选的空白
  • 匹配
  • ([+-]?\d+)与“c”参数
  • 匹配
  • \s*=\s*0将“= 0”与一些可选空格匹配

  • 让我们将其包装在class中:
    private static final class QuadraticEq {
        private static final Pattern EQN = Pattern.compile("([+-]?\\d+)[Xx]2\\s*([+-]?\\d+)[Xx]\\s*([+-]?\\d+)\\s*=\\s*0");
        private final int a;
        private final int b;
        private final int c;
    
        private QuadraticEq(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    
        public static QuadraticEq parseString(final String eq) {
            final Matcher matcher = EQN.matcher(eq);
            if (!matcher.matches()) {
                throw new IllegalArgumentException("Not a valid pattern " + eq);
            }
            final int a = Integer.parseInt(matcher.group(1));
            final int b = Integer.parseInt(matcher.group(2));
            final int c = Integer.parseInt(matcher.group(3));
            return new QuadraticEq(a, b, c);
        }
    
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("QuadraticEq{");
            sb.append("a=").append(a);
            sb.append(", b=").append(b);
            sb.append(", c=").append(c);
            sb.append('}');
            return sb.toString();
        }
    }
    

    请注意\\,这是Java必需的。

    快速测试:
    System.out.println(QuadraticEq.parseString("4x2-4x-42=0"));
    

    输出:
    QuadraticEq{a=4, b=-4, c=-42}
    

    10-08 00:19