użyć wyrażenia regularnego, następujący wzór będzie działać:
([+-]?\d+)[Xx]2\s*([+-]?\d+)[Xx]\s*([+-]?\d+)\s*=\s*0
To będzie pasował kwadratowe i wyodrębnij parametry, sprawdź, jak działa:
(...)
to grupy
[+-]?\d+
wychwytywania może dopasować liczbę cyfr, poprzedzonego ewentualnie przez +
lub -
[Xx]
Dopasowuje „X” lub „X”
\s*
to zero lub więcej miejsc
Więc
([+-]?\d+)
odpowiada "a" argumentu
[Xx]2
pasuje "X2" lub "x2"
\s*
dopasowania opcjonalnie odstępy
([+-]?\d+)
odpowiada "b" argumentu
[Xx]
dopasowania "X" lub "X"
\s*
mecze opcjonalnie odstępu
([+-]?\d+)
mecze "c" argumentu
\s*=\s*0
mecze "= 0" z niektórych opcjonalnych przestrzeniach
Pozwala owinąć to w 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();
}
}
zanotować \\
jest to wymagane przez Java.
Szybki test:
System.out.println(QuadraticEq.parseString("4x2-4x-42=0"));
wyjściowa:
QuadraticEq{a=4, b=-4, c=-42}
Czy wejście ma zawsze format '+/- aX2 +/- bX +/- c'? Brzmi jak zadanie dla ... regex. –
tak. zawsze w tym formacie –
Czy potrzebujesz tylko współczynników? Jeśli masz zamiar później wykorzystać wykładniki, poleciłbym zbudować mały analizator składni dla twoich wyrażeń. – Turing85