从String中提取整数和字符

时间:2017-01-24 21:51:49

标签: java expression extraction

我正在使用堆栈数据结构解决数学表达式问题,并且我在从字符串中提取数字和数学符号时遇到困难。我想要做的是制作一个程序来评估给定的表达式。

我的问题是,如何从字符串中提取所有数字和符号到新的字符串数组?

Input: 12*1*145*2+8*1*1+2*3+2+4

新的字符串数组应为:

String[] expArray={"12","*","1","*","145","*","2","+","8","*","1","*","1","+","2","*","3","+","2","+","4"}

我尝试使用nextInt()split()next()nextByte(),但未成功。别担心别的什么。我刚刚提到问题只是为了清楚我在说什么。

更新:我不需要像array[i]*10+array[i+1]或类似的东西那样构建整数的解决方案。我需要的是更优化的解决方案。

2 个答案:

答案 0 :(得分:2)

但是,由于其他人可能感兴趣,我还是张贴了。

import java.util.*;

public class Test {
    public static void main(String... args) {
        String s = "12*1*145*2+8*1*1+2*3+2+4";
        List<String> tokens = new ArrayList<>();
        // for building numbers
        StringBuilder builder = new StringBuilder();
        // assume there are only 2 types (number and operators)
        boolean isNumber = false;
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                if (!isNumber) {
                    builder = new StringBuilder();
                    isNumber = true;
                }
                builder.append(c);
            } else {
                if (isNumber) {
                    tokens.add(builder.toString());
                    isNumber = false;
                }
                // assume operators are exactly 1 char
                tokens.add(String.valueOf(c));
            }
        }
        if (isNumber)
            tokens.add(builder.toString());
        System.out.println(tokens);
    }
}

输出:

[12, *, 1, *, 145, *, 2, +, 8, *, 1, *, 1, +, 2, *, 3, +, 2, +, 4]

更通用的方法是使用enum类型来保持当前状态而不是boolean,并对所有类型使用builder,以便其标记不受限制到1个字符。

然后你可能需要建立一个AST ...

答案 1 :(得分:1)

使用Regex为其他人提供的解决方案:

String inputStr = "12*1*145*2+8*1*1+2*3+2+4";
String inputPattern = "(\\d+|[+-/*]{1})";

List<String> strList=new ArrayList<>();

Pattern patternObj = Pattern.compile(inputPattern);
Matcher matcherObj = patternObj.matcher(inputStr);


while (matcherObj.find()) {         
    strList.add(matcherObj.group(0));
}

System.out.println(strList);