Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java';s正则表达式拆分嵌套的数学方程_Java_Regex_String - Fatal编程技术网

如何使用Java';s正则表达式拆分嵌套的数学方程

如何使用Java';s正则表达式拆分嵌套的数学方程,java,regex,string,Java,Regex,String,我很好奇如何使用java的字符串正则表达式有意义地拆分带括号的数学方程。没有一个例子很难解释,下面是一个例子 一个通用的解决方案模式,而不是一个只适用于下面提供的示例的模式,是值得赞赏的 String s = "(5 + 6) + (2 - 18)"; // I want to split this string via the regex pattern of "+", // (but only the non-nested ones) // with the result being [(

我很好奇如何使用java的字符串正则表达式有意义地拆分带括号的数学方程。没有一个例子很难解释,下面是一个例子

一个通用的解决方案模式,而不是一个只适用于下面提供的示例的模式,是值得赞赏的

String s = "(5 + 6) + (2 - 18)";
// I want to split this string via the regex pattern of "+",
// (but only the non-nested ones) 
// with the result being [(5 + 6), (2 - 18)]

s.split("\\+"); // Won't work, this will split via every plus.
我主要寻找的是一级拆分,我想要一个正则表达式检查,看看像“+”或“-”这样的符号是否以任何形式嵌套,如果是,不要拆分,如果不是拆分。嵌套可以是()或[]的形式


谢谢。

不幸的是,不使用RegEx,您需要一个类似于

的库不幸的是,不使用RegEx,您需要一个类似于

的库如果您不希望像((6+5)-4)这样拆分嵌套表达式,我有一个非常简单的函数来拆分表达式,而不使用正则表达式:

public static String[] subExprs(String expr) {
    /* Actual logic to split the expression */
    int fromIndex = 0;
    int subExprStart = 0;
    ArrayList<String> subExprs = new ArrayList<String>();
    again:
    while ((subExprStart = expr.indexOf("(", fromIndex)) != -1) {
        fromIndex = subExprStart;
        int substringEnd=0;
        while((substringEnd = expr.indexOf(")", fromIndex)) != -1){
            subExprs.add(expr.substring(subExprStart, substringEnd+1));
            fromIndex = substringEnd + 1;
            continue again; 
        }
    }

    /* Logic only for printing */
    System.out.println("Original expression : " + expr);
    System.out.println();
    System.out.print("Sub expressions : [ ");
    for (String string : subExprs) {
        System.out.print(string + ", ");
    }
    System.out.print("]");
    String[] subExprsArray = {};
    return subExprs.toArray(subExprsArray);
}
示例输出:

原始表达:(a+b)+[5+6]+(57-6)-[a-b]+[c-d]

子表达式:[(a+b),[5+6],(57-6),[a-b],[c-d],]


建议对代码进行改进。:)

如果您不希望像((6+5)-4)这样拆分嵌套表达式,我有一个非常简单的函数,可以在不使用正则表达式的情况下拆分表达式:

public static String[] subExprs(String expr) {
    /* Actual logic to split the expression */
    int fromIndex = 0;
    int subExprStart = 0;
    ArrayList<String> subExprs = new ArrayList<String>();
    again:
    while ((subExprStart = expr.indexOf("(", fromIndex)) != -1) {
        fromIndex = subExprStart;
        int substringEnd=0;
        while((substringEnd = expr.indexOf(")", fromIndex)) != -1){
            subExprs.add(expr.substring(subExprStart, substringEnd+1));
            fromIndex = substringEnd + 1;
            continue again; 
        }
    }

    /* Logic only for printing */
    System.out.println("Original expression : " + expr);
    System.out.println();
    System.out.print("Sub expressions : [ ");
    for (String string : subExprs) {
        System.out.print(string + ", ");
    }
    System.out.print("]");
    String[] subExprsArray = {};
    return subExprs.toArray(subExprsArray);
}
示例输出:

原始表达:(a+b)+[5+6]+(57-6)-[a-b]+[c-d]

子表达式:[(a+b),[5+6],(57-6),[a-b],[c-d],]


建议对代码进行改进。:)

根据定义,您无法知道永远不会得到超过一级的括号,也无法使用正则表达式分析递归语法。您需要使用或编写解析器。有aloo,Dijkstra调车场算法,递归下降表达式解析器,或者一个库,可以这样做,

你不知道你永远不会得到超过一个级别的括号,你也不能用正则表达式分析递归语法。您需要使用或编写解析器。让aloo,为Dijkstra调车场算法,或递归下降表达式解析器,或一个可以这样做的库做准备,

你也期望像((6-5)+4)这样的嵌套表达式分裂吗?不,我需要的只是一级分裂,我需要一个正则表达式检查,看看像“+”或“-”这样的符号是否以任何形式嵌套,如果是,如果它不分开,就不要分开它。嵌套可以是()或[]的形式。请检查我的答案。。让我为[]添加逻辑。这不是您最初的要求..您是否也希望拆分嵌套表达式,如((6-5)+4)?不,我只需要一级拆分,我需要一个正则表达式检查“+”或“-”之类的符号是否以任何形式嵌套,如果是,不要拆分,如果不是拆分。嵌套可以是()或[]的形式。请检查我的答案。。让我为[]添加逻辑。这不是您最初的要求..奇怪的是,当您的问题指定使用正则表达式时,您将此答案标记为正确。不是说这实际上是可能的。@EJP根据不同的答案,在正则表达式中没有可用的解决方案。此外,作者只想要一个层次的偏执。我问过他一些嵌套表达式,比如((6+5)-3)。因此,我给出了这个答案,以减少新库的开销。你觉得这是对的吗?奇怪的是,当你的问题指定使用正则表达式时,你把这个答案标记为正确的。不是说这实际上是可能的。@EJP根据不同的答案,在正则表达式中没有可用的解决方案。此外,作者只想要一个层次的偏执。我问过他一些嵌套表达式,比如((6+5)-3)。因此,我给出了这个答案,以减少新库的开销。你觉得这样对吗?