我很好奇如何使用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.
我主要想要的是第一级分割,我想要一个正则表达式检查,看看像是“+”或“ - ”这样的符号是否以任何形式嵌套,如果是,不要拆分它,如果它没有拆分它。嵌套可以是()或[]。
的形式谢谢。
答案 0 :(得分:5)
不幸的是,不是使用RegEx,您需要一个像JEP
这样的库答案 1 :(得分:1)
如果您不希望拆分嵌套表达式,如((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);
}
Sample output :
原始表达:(a + b)+(5 + 6)+(57-6)
子表达式:[(a + b),(5 + 6),(57-6),]
修改强>
对于同时获取[]
中包含的表达式的额外条件,此代码将处理()
和[]
内的表达式。
public static String[] subExprs(String expr) {
/* Actual logic to split the expression */
int fromIndex = 0;
int subExprStartParanthesis = 0;
int subExprStartSquareBrackets = 0;
ArrayList<String> subExprs = new ArrayList<String>();
again: while ((subExprStartParanthesis = expr.indexOf("(", fromIndex)) > -2
&& (subExprStartSquareBrackets = expr.indexOf("[", fromIndex)) > -2) {
/* Check the type of current bracket */
boolean isParanthesis = false;
if (subExprStartParanthesis == -1
&& subExprStartSquareBrackets == -1)
break;
else if (subExprStartParanthesis == -1)
isParanthesis = false;
else if (subExprStartSquareBrackets == -1)
isParanthesis = true;
else if (subExprStartParanthesis < subExprStartSquareBrackets)
isParanthesis = true;
/* Extract the sub expression */
fromIndex = isParanthesis ? subExprStartParanthesis
: subExprStartSquareBrackets;
int subExprEndParanthesis = 0;
int subExprEndSquareBrackets = 0;
if (isParanthesis) {
while ((subExprEndParanthesis = expr.indexOf(")", fromIndex)) != -1) {
subExprs.add(expr.substring(subExprStartParanthesis,
subExprEndParanthesis + 1));
fromIndex = subExprEndParanthesis + 1;
continue again;
}
} else {
while ((subExprEndSquareBrackets = expr.indexOf("]", fromIndex)) != -1) {
subExprs.add(expr.substring(subExprStartSquareBrackets,
subExprEndSquareBrackets + 1));
fromIndex = subExprEndSquareBrackets + 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);
}
Sample Output :
原始表达:(a + b)+ [5 + 6] +(57-6) - [a-b] + [c-d]
子表达式:[(a + b),[5 + 6],(57-6),[a-b],[c-d],]
建议改进代码。 :)
答案 2 :(得分:0)
根据定义,您无法知道您将永远不会获得多个括号级别,也无法使用正则表达式分析递归语法。您需要使用或编写解析器。有aloo,围绕Dijkstra Shunting Yard算法,或递归下降表达式解析器,或者可以执行任何一个的库,