在Java中分割和读取字符串

时间:2016-05-10 16:54:23

标签: java string

我编写了一个与计算器类似的代码,但它解决了密码算术方程式。它适用于+ - * /等基本操作。 现在我添加了电源和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];


}

3 个答案:

答案 0 :(得分:2)

split使用正则表达式(regex)作为参数。有些字符在正则表达式中有special meaning(我们称之为元字符),^就是其中之一。它通常表示字符串的开头,或者可用于创建负字符集,如[^a-z]将表示不在az范围内的任何字符。

如果您想将^更改为简单文字,则需要像

一样将其转义

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数组