Java 使用正则表达式拆分字符串来计算字符串中的数学表达式
我需要一些字符串中的数学表达式 到目前为止,我的代码只适用于正数 我使用正则表达式将字符串拆分为两个单独的数组。我能把所有的数学符号分成一个数组,把所有的数字分成另一个数组。但我不确定如何处理负数。(我不懂正则表达式,我只是放了一些东西,它起作用了,但不适用于负数) 无论如何,这是我的代码,提前谢谢`Java 使用正则表达式拆分字符串来计算字符串中的数学表达式,java,regex,string,Java,Regex,String,我需要一些字符串中的数学表达式 到目前为止,我的代码只适用于正数 我使用正则表达式将字符串拆分为两个单独的数组。我能把所有的数学符号分成一个数组,把所有的数字分成另一个数组。但我不确定如何处理负数。(我不懂正则表达式,我只是放了一些东西,它起作用了,但不适用于负数) 无论如何,这是我的代码,提前谢谢` boolean mybool = true; String str = "1.0+2.0+3.0+4.0"; String[] numarray = str.split("
boolean mybool = true;
String str = "1.0+2.0+3.0+4.0";
String[] numarray = str.split("[-+/%*]");
String[] signarray = str.split("[0123456789.]");
double result = 0.0;
double num1 = 0.0;
double num2 = 0.0;
String mystr = "";
//Adds each element in sign array to mystr
for(String e : signarray){
if(e != ""){
mystr+=e;
}
}
//Assign signarray new size of length mystr
signarray = new String[mystr.length()];
//Cycle through each element in str and add it to signarray
for(int i = 0; i < mystr.length(); i++){
signarray[i] = mystr.charAt(i)+"";
}
//Print each element in num array
System.out.print("Print each element in number array: ");
for(String e : numarray){
System.out.print(e+ " ");
}
System.out.println();
System.out.print("Print each element in sign array: ");
//print each element in sign array
for(String e : signarray){
System.out.print(e+ " ");
}
System.out.println();
//Prints each element in sign array and element value
for(int i = 0; i < signarray.length; i++){
System.out.println("SignArray[" + i + "] = " + signarray[i]);
}
for(int i = 2; i <= numarray.length; i++){
//this will get the first two indexes of number array
//and store them in num1 and num1 then i use another if
//statement to go sign array to get a sign to evaluate the
//two nums and store the value in result.
//hopefully you understand my logic
if(mybool == true){
num1 = Double.parseDouble(numarray[0]);
num2 = Double.parseDouble(numarray[1]);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
if(signarray[0].equals("+")){
result = num1 + num2;
System.out.println("Result = num1 + num2 = " + num1 + "+" + num2 + "= " + result );
} else if(signarray[0].equals("-")){
result = num1 - num2;
System.out.println("Result = num1 - num2 = " + num1 + "-" + num2 + "= " + result );
} else if(signarray[0].equals("/")){
result = num1 / num2;
System.out.println("Result = num1 / num2 = " + num1 + "/" + num2 + "= " + result );
} else if(signarray[0].equals("*")){
result = num1 * num2;
System.out.println("Result = num1 * num2 = " + num1 + "*" + num2 + "= " + result );
} else if(signarray[0].equals("%")){
result = num1 % num2;
System.out.println("Result = num1 % num2 = " + num1 + "%" + num2 + "= " + result );
}
mybool = false;
} else {
num2 = Double.parseDouble(numarray[i-1]);
System.out.println("Num2 = " + num2);
if(signarray[i-2].equals("+")){
result = result + num2;
System.out.println("Result after math is : " + result);
} else if(signarray[i-2].equals("-")){
result = result - num2;
System.out.println("Result after math is : " + result);
} else if(signarray[i-2].equals("/")){
result = result / num2;
System.out.println("Result after math is : " + result);
} else if(signarray[i-2].equals("*")){
result = result * num2;
System.out.println("Result after math is : " + result);
} else if(signarray[i-2].equals("%")){
result = result % num2;
System.out.println("Result after math is : " + result);
}
}
}`
最终我希望能够计算出这样的字符串
//String str=“3.01+2.2/4.01*7.1%4.0--2.0”
但是我不知道如何从sting中获取负数并存储在num数组中
谢谢你的帮助 理想情况下,应该使用解析器而不是正则表达式。然而,考虑到您当前的需求,使用正面和负面的lookbehind会很简单 (1) 。运算符的前面总是有一个十进制数。因此,我们通过匹配十进制数(正查找)后出现的任何运算符来拆分参数
String[]arguments=str.split((?--thould-throw-(-2)最好是我会调查你的正则表达式的正面和负面外观。或者更好的是,不要使用正则表达式使用解析器。如果你在符号上分割,你永远不会得到符号。此外,--2.0
是-1*-2.0
你不应该使用正则表达式。你需要一个合适的扫描器,然后是一个表达式解析器将其全部删除并查找Disjkstra调车场算法或递归下降表达式解析。
Print each element in number array: 1.0 2.0 3.0 4.0
Print each element in sign array: + + +
SignArray[0] = +
SignArray[1] = +
SignArray[2] = +
num1 = 1.0
num2 = 2.0
Result = num1 + num2 = 1.0+2.0= 3.0
Num2 = 3.0
Result after math is : 6.0
Num2 = 4.0
Result after math is : 10.0
String[] arguments = str.split("(?<=\\d)[-+/%*]");
String[] operators = str.split("(?<!\\d)-?[0-9.]+");