我编写了一个与计算器类似的代码,但它解决了密码算术方程式。它适用于+ - * /等基本操作。 现在我添加了电源和root操作,当我使用这两个新操作时,它不起作用。似乎问题在于我分割输入字符串的方式。问题是它没有用" ^"来分割字符串。运营商。以下是出现问题的代码:
private void findOperator() {
// TODO Auto-generated method stub
String[] tempString = this.rawInputString.split("");
for(String s : tempString){
if(s.equals("+")){
this.operator = "[+]";
break;
}
else if(s.equals("*")){
this.operator = "[*]";
break;
}
else if(s.equals("-")){
this.operator = s;
break;
}
else if(s.equals("/")){
this.operator = s;
break;
}
else if(s.equals("^")){
this.operator = s;
break;
}
else if(s.equals("sqrt")){
this.operator = s;
break;
}
}
}
public void parseInput(){
String[] tempString = rawInputString.split(this.operator);
this.firstString = tempString[0].split("");
this.firstLetterFirstNumber = this.firstString[0];
String temporarySecondPart = tempString[1];//This is where it says I
//have the problem, but it works fine
//with other operators
this.operator = rawInputString.substring(this.firstString.length,this.firstString.length+1);
tempString = temporarySecondPart.split("=");
this.secondString = tempString[0].split("");
this.firstLetterSecondNUmber = this.secondString[0];
this.result = tempString[1].split("");
this.firstLetterResult = this.result[0];
}
答案 0 :(得分:2)
split
使用正则表达式(regex)作为参数。有些字符在正则表达式中有special meaning(我们称之为元字符),^
就是其中之一。它通常表示字符串的开头,或者可用于创建负字符集,如[^a-z]
将表示不在a
和z
范围内的任何字符。
如果您想将^
更改为简单文字,则需要像
split("\\^")
但更安全的方法是允许正则表达式为你逃避。为此,请使用
split(Pattern.quote("^"))
或在你的情况下
split(Pattern.quote(operator))
。
答案 1 :(得分:2)
你正在做一些奇怪的跳过该代码中的箍。
findOperator()
将rawInputString
拆分为1个字符的字符串,然后搜索第一个+
,*
,-
,/
或^
(忽略不起作用sqrt
)并将其作为正则表达式分配给this.operator
。
然后使用该正则表达式分割rawInputString
。为什么呢?
您刚刚在findOperator()
找到了它,因此您确切地知道它在哪里。
然后你开始分裂,分裂和分裂......
所有这一切,当你想要做的就是解析一个字符串a op b = c
?
而你似乎想要将它们全部保存在字段中:
firstString a as a String[] of 1-character
operator op
secondString b as a String[] of 1-character
result c as a String[] of 1-character
firstLetterFirstNumber First 1-character string in firstString
firstLetterSecondNUmber First 1-character string in secondString
firstLetterResult First 1-character string in result
并且没有任何错误处理,因此您获得了ArrayIndexOutOfBoundsException
,而不是一些有意义的错误。
只需使用一个正则表达式,即可为您准备好所有值
使用toCharArray()
会将1个字符的值作为char[]
。
String rawInputString = "3√343=7";
String regex = "(.+?)([-+*/^√])(.+?)=(.+)";
Matcher m = Pattern.compile(regex).matcher(rawInputString);
if (! m.matches())
throw new IllegalArgumentException("Bad input: " + rawInputString);
char[] firstString = m.group(1).toCharArray();
String operator = m.group(2);
char[] secondString = m.group(3).toCharArray();
char[] result = m.group(4).toCharArray();
char firstLetterFirstNumber = firstString[0];
char firstLetterSecondNUmber = secondString[0];
char firstLetterResult = result[0];
System.out.println("firstString = " + Arrays.toString(firstString));
System.out.println("operator = " + operator);
System.out.println("secondString = " + Arrays.toString(secondString));
System.out.println("result = " + Arrays.toString(result));
<强>输出强>
firstString = [3]
operator = √
secondString = [3, 4, 3]
result = [7]
答案 2 :(得分:0)
试试这个正则表达式
<div data-role="content">
<div id="divParteSuperior" style="height:300px;">
</div>
<div id="divParteInferior">
</div>
</div>
你的输出就像那样
String abc = "a+b-c*d^f";
String reg = "((?<=[<=|>=|==|\\+|\\*|\\-|<|>|/|=|\\^])|(?=[<=|>=|==|\\+|\\*|\\-|<|>|/|=|\\^]))";
String [] arr = abc.split(reg); //split your String according to Expression
for(String obj : arr)
System.out.println(obj);
注意: - 只需在行中找到任何数学表达式,您的完整数学表达式将被拆分为一个String数组