Java 用正则表达式处理多项式幂的^符号

Java 用正则表达式处理多项式幂的^符号,java,regex,Java,Regex,我试图处理一个字符串来检测多项式并得到它们的幂和系数,但我的正则表达式似乎有问题,总是给我错误的结果,或者在某些情况下,导致异常 Pattern pattern = Pattern.compile("([+-]?(?:(?:\\d+x\\^\\d+)|(?:\\d+x)|(?:\\d+)|(?:x)))"); Matcher matcher = pattern.matcher(expr); while (matcher.find()) { if(matcher.group(1).matc

我试图处理一个字符串来检测多项式并得到它们的幂和系数,但我的正则表达式似乎有问题,总是给我错误的结果,或者在某些情况下,导致异常

Pattern pattern = Pattern.compile("([+-]?(?:(?:\\d+x\\^\\d+)|(?:\\d+x)|(?:\\d+)|(?:x)))");
Matcher matcher = pattern.matcher(expr);
while (matcher.find()) {
    if(matcher.group(1).matches("[0-9]+")) {
        a = Integer.parseInt(matcher.group(1));
        b = 0;
    } else if(matcher.group(1).matches("\\^")) {
        a = Integer.parseInt(expr.substring(0, expr.indexOf("x")));
        b = Integer.parseInt(expr.substring(0, expr.indexOf("^"))+1);
    } else {
        a = Integer.parseInt(expr.substring(0, expr.indexOf("x")));
        b = 1;
    }
}
这应该能够检测并给我有效的输出,如果像

5倍^3+2倍+1

作为输入提供。(这是一个更大方法的一部分,因此输入在被这些代码行处理之前会被分解成碎片)
由于我是编程新手,我似乎无法理解问题是出在正则表达式还是java语法上

\^(-?\d+(?:\.\d+)?)|(-?\d+(?:\.\d+)?)|(x)
或者

也许最好调查一下,这样你就能解决问题了


这里,第一组查找指数值,第二组查找指数值 返回系数,第三组返回
x
(以便 你可以算出等式中是否有常数)

试验
如果您希望简化/修改/探索表达式,将在的右上面板中进行解释。如果您愿意,还可以在中查看它与一些示例输入的匹配情况


正则表达式电路 可视化正则表达式:

例2
这里有一个可能的解决方案,它为每个指数值(0为常数)生成一个系数数组。它搜索常量值或形式为ax^y的内容,其中^y部分是可选的。
a
变量的大小应根据您在等式中期望的最大指数确定

int[] a = new int[4];
int exp, coeff;
String expr = "-5x^3 + 2x - 1";
Pattern pattern = Pattern.compile("((?:((?:^|\\s*[+-]\\s*)\\d*)x(?:\\^(\\d+))?)|(?:[+-]\\s*\\d+))");
Matcher matcher = pattern.matcher(expr);
while (matcher.find()) {
    if(matcher.group(1).matches("[+-]\\s*\\d+")) {
        // the constant part
        a[0] = Integer.parseInt(matcher.group(1).replace(" ", ""));
    }
    else {
        // a variable part
        coeff = (matcher.group(2) != "") ? Integer.parseInt(matcher.group(2).replace(" ", "")) : 1;
        exp = (matcher.group(3) != "" && matcher.group(3) != null) ? Integer.parseInt(matcher.group(3)) : 1;
        a[exp] = coeff;
    }
}
System.out.println(Arrays.toString(a));
输出(对于本例)


我可以告诉你这么多:java语法还可以,正则表达式至少还可以,但它可能无法满足你的需要。由于您没有提到抛出了哪些异常,或者没有提到调用堆栈,因此我假设它们是NumberFormatExceptions,并且您向使用
matcher.group(1)的ParseInt提供了无效输入
在某些情况下,当group=1不存在时,这可能会导致异常。请提供示例输入和预期输出,并准确显示当前代码的工作方式。正则表达式不是解决此问题的好方法。您最好使用传统的扫描仪和解析器。
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\^(-?\\d+(?:\\.\\d+)?)|(-?\\d+(?:\\.\\d+)?)|(x)";
        final String string = "5x^3 +2x +1\n"
             + "5x^-3.1 +2x -1\n"
             + "5x^3.23 -2012.12x +10.12\n"
             + "-5x^3.54 +2x -1.512";

        final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }

    }
}
Full match: 5
Group 1: null
Group 2: 5
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^3
Group 1: 3
Group 2: null
Group 3: null
Full match: 2
Group 1: null
Group 2: 2
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: 1
Group 1: null
Group 2: 1
Group 3: null
Full match: 5
Group 1: null
Group 2: 5
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^-3.1
Group 1: -3.1
Group 2: null
Group 3: null
Full match: 2
Group 1: null
Group 2: 2
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: -1
Group 1: null
Group 2: -1
Group 3: null
Full match: 5
Group 1: null
Group 2: 5
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^3.23
Group 1: 3.23
Group 2: null
Group 3: null
Full match: -2012.12
Group 1: null
Group 2: -2012.12
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: 10.12
Group 1: null
Group 2: 10.12
Group 3: null
Full match: -5
Group 1: null
Group 2: -5
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^3.54
Group 1: 3.54
Group 2: null
Group 3: null
Full match: 2
Group 1: null
Group 2: 2
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: -1.512
Group 1: null
Group 2: -1.512
Group 3: null
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\^(-?\\d+(?:\\.\\d+)?)|(-?\\d+(?:\\.\\d+)?)|(x)";
        final String string = "12x^11 +10x^9 -8x^7 +9x^6 -5x^3 +2x -1";
        final Pattern pattern = Pattern.compile(regex);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }

    }
}
Full match: 12
Group 1: null
Group 2: 12
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^11
Group 1: 11
Group 2: null
Group 3: null
Full match: 10
Group 1: null
Group 2: 10
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^9
Group 1: 9
Group 2: null
Group 3: null
Full match: -8
Group 1: null
Group 2: -8
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^7
Group 1: 7
Group 2: null
Group 3: null
Full match: 9
Group 1: null
Group 2: 9
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^6
Group 1: 6
Group 2: null
Group 3: null
Full match: -5
Group 1: null
Group 2: -5
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: ^3
Group 1: 3
Group 2: null
Group 3: null
Full match: 2
Group 1: null
Group 2: 2
Group 3: null
Full match: x
Group 1: null
Group 2: null
Group 3: x
Full match: -1
Group 1: null
Group 2: -1
Group 3: null
int[] a = new int[4];
int exp, coeff;
String expr = "-5x^3 + 2x - 1";
Pattern pattern = Pattern.compile("((?:((?:^|\\s*[+-]\\s*)\\d*)x(?:\\^(\\d+))?)|(?:[+-]\\s*\\d+))");
Matcher matcher = pattern.matcher(expr);
while (matcher.find()) {
    if(matcher.group(1).matches("[+-]\\s*\\d+")) {
        // the constant part
        a[0] = Integer.parseInt(matcher.group(1).replace(" ", ""));
    }
    else {
        // a variable part
        coeff = (matcher.group(2) != "") ? Integer.parseInt(matcher.group(2).replace(" ", "")) : 1;
        exp = (matcher.group(3) != "" && matcher.group(3) != null) ? Integer.parseInt(matcher.group(3)) : 1;
        a[exp] = coeff;
    }
}
System.out.println(Arrays.toString(a));
[-1, 2, 0, -5]