Пытаясь решить эту проблему, я случайно попал туда, где он также будет анализировать недопустимые выражения ... valid.С помощью некоторой простой логики вы можете отсеять грязные выражения, но это может сработать.Я буду продолжать проверять, смогу ли я найти лучшее решение.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
//Scanner scan = new Scanner("+3x^7 3445x^233 3x 34 355");
Scanner scan = new Scanner("+3x^7+3445x^233-3x +34355");
while (scan.hasNext()) {
String s = scan.next();
Pattern p = Pattern.compile("((?:[\\+\\-]*?)?\\d+)?x?(?:\\^(\\d+))?");
Matcher m = p.matcher(s);
while (m.find())
System.out.println(m.group());
}
}
}
Это можно использовать для проверки правильности выражения:
if(!s.matches("(?:[\\+\\-]*\\d*x?\\^?\\d*)") && !s.equals(""))
РЕДАКТИРОВАТЬ II
Вот пример того, как я извлекаю «части» из уравнения:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner("+3x^7 3445x^233 3x 34 355");
//Scanner scan = new Scanner("+3x^7+3445x^233-3x +34355");
while (scan.hasNext()) {
String s = scan.next();
if(!s.matches("(?:[\\+\\-]*\\d*x?\\^?\\d*)") && !s.equals(""))
System.exit(0);
Pattern p = Pattern.compile("(?:([\\+\\-]*?)?(\\d+))?x?(\\^(\\d+))?");
Matcher m = p.matcher(s);
while (m.find())
for(int i = 0; i < m.groupCount(); i++)
if(m.group(i) == null)
continue;
else
System.out.println(m.group(i));
}
}
}
ВЫХОД:
Original:
+3x^7
Parts:
+
3
^7
Original:
3445x^233
Parts:
3445
^233
Original:
3x
Parts:
3
Original:
34
Parts:
34
Original:
355
Parts:
355
Я надеюсьэто ведет вас в правильном направлении.