2011-11-14 50 views
2

我试图让,将采取这样的如何用Java解析字符串?

5 + 4 + 3 - 2 - 10 + 15 

一个字符串,我需要Java来此字符串解析到一个数组

{5, +4, +3, -2, -10, +15} 

一个简单的计算器应用程序假定用户可以输入0以上每个号码和每个运营商之间的空格

我是新来的Java,所以我不完全确定如何做到这一点。

+0

最简单的方法是使用正则表达式('Matcher'和'Pattern'类)。话虽如此,你确定这真的是你想要做的吗?你会用这两个阵列做什么? –

+0

我想这超出了规范。你的家庭作业,但*容易*的方式来(解析&)评估'字符串'是使用'ScriptEngine'在本例中看到(http://stackoverflow.com/questions/7441625/how-to-找到-一个按钮 - 源在-AWT-计算器功课/ 7441804#7441804)。 –

回答

0

基于关闭的一些问题的答案输入在这里,我发现这成为最佳解决方案

// input 
String s = "5 + 4 + 3 - 2 - 10 + 15"; 
ArrayList<Integer> numbers = new ArrayList<Integer>(); 

// remove whitespace 
s = s.replaceAll("\\s+", ""); 

// parse string 
Pattern pattern = Pattern.compile("[-]?\\d+"); 
Matcher matcher = pattern.matcher(s); 

// add numbers to array 
while (matcher.find()) { 
    numbers.add(Integer.parseInt(matcher.group())); 
} 

// numbers 
// {5, 4, 3, -2, -10, 15} 
0

您可以使用Integer.parseInt来获取值,将可以用String类实现的字符串分开。一个正则表达式可以工作,但我不知道该怎么做的:3

0

String.split()看看:

String str = "1 + 2"; 
System.out.println(java.util.Arrays.toString(str.split(" "))); 

[1,+ 2]

注意分裂使用正则表达式,所以你必须引用字符来分割“。”。或具有特殊含义的类似字符。此外,一行中的多个空格将在解析数组中创建空字符串,您将需要跳过。

这解决了这个简单的例子。为了更真实地解析真正的表达式,你需要创建一个语法并使用类似Antlr的东西。

0

str成为您的行缓冲区。

使用Regex.match模式([-+]?[ \t]*[0-9]+)

将所有匹配累加到String[] tokens

然后,对每个tokentokens

String s[] = tokens[i].split(" +"); 
if (s.length > 1) 
    tokens[i] = s[0] + s[1]; 
else 
    tokens[i] = s[0]; 
0

您可以使用正回顾后:

String s = "5 + 4 + 3 - 2 - 10 + 15"; 
    Pattern p = Pattern.compile("(?<=[0-9]) +"); 
    String[] result = p.split(s); 

    for(String ss : result) 
     System.out.println(ss.replaceAll(" ", "")); 
0
String cal = "5 + 4 + 3 - 2 - 10 + 15"; 
    //matches combinations of '+' or '-', whitespace, number 
    Pattern pat = Pattern.compile("[-+]{1}\\s*\\d+"); 
    Matcher mat = pat.matcher(cal); 
    List<String> ops = new ArrayList<String>(); 
    while(mat.find()) 
    { 
     ops.add(mat.group()); 
    } 
    //gets first number and puts in beginning of List 
    ops.add(0, cal.substring(0, cal.indexOf(" "))); 

    for(int i = 0; i < ops.size(); i++) 
    { 
     //remove whitespace 
     ops.set(i, ops.get(i).replaceAll("\\s*", "")); 
    } 

    System.out.println(Arrays.toString(ops.toArray())); 
    //[5, +4, +3, -2, -10, +15]