如何用Java解析字符串?

时间:2011-11-14 01:24:52

标签: java regex parsing

我正在尝试创建一个简单的计算器应用程序,它将采用像这样的字符串

5 + 4 + 3 - 2 - 10 + 15

我需要Java将此字符串解析为数组

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

假设用户可以在每个号码和每个运营商之间输入0或更多空格

我是Java的新手,所以我不完全确定如何实现这一目标。

6 个答案:

答案 0 :(得分:0)

您可以使用Integer.parseInt获取值,拆分您可以使用String类实现的字符串。正则表达式可以工作,但我不知道如何做到这些:3

答案 1 :(得分:0)

看看String.split()

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

[1,+,2]

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

这解决了这个简单的例子。要更严格地解析真实表达式,您需要创建语法并使用类似Antlr的内容。

答案 2 :(得分:0)

str成为您的行缓冲区。

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

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

然后,对于token中的每个tokens

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

答案 3 :(得分:0)

你可以使用积极的lookbehind:

    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(" ", ""));

答案 4 :(得分: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]

答案 5 :(得分: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}