Java程序从二次方程中提取系数

7 java regex string math

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

String str1;
str1 = "4x2-4x-42=0"
Run Code Online (Sandbox Code Playgroud)

所以我需要从给定的输入字符串中分割系数并得到输出

a = 4 b = -4 c = -42
Run Code Online (Sandbox Code Playgroud)

我试过这个:

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]);
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*der 2

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

([+-]?\d+)[Xx]2\s*([+-]?\d+)[Xx]\s*([+-]?\d+)\s*=\s*0
Run Code Online (Sandbox Code Playgroud)

这将匹配二次并提取参数,让我们看看它是如何工作的:

  • (...)这是捕获组
  • [+-]?\d+这匹配多个数字,前面可选地带有+-
  • [Xx]这匹配“X”或“x”
  • \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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

快速测试:

System.out.println(QuadraticEq.parseString("4x2-4x-42=0"));
Run Code Online (Sandbox Code Playgroud)

输出:

QuadraticEq{a=4, b=-4, c=-42}
Run Code Online (Sandbox Code Playgroud)