Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从字符串中提取整数和字符_Java_Expression_Extraction - Fatal编程技术网

Java 从字符串中提取整数和字符

Java 从字符串中提取整数和字符,java,expression,extraction,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"} 我尝试了n

我正在使用堆栈数据结构解决数学表达式问题,我一直在从字符串中提取数字和数学符号。我想做的是制作一个程序来计算给定的表达式

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

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]
或类似的构建整数的解决方案。我需要的是更好的解决方案。

但由于其他人可能感兴趣,我还是发布了

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);
    }
}
更通用的方法是使用类型的
enum
来保持当前状态,而不是使用
布尔值
,并对所有类型使用
builder
,以便它们的标记不限于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);
String inputStr=“12*1*145*2+8*1*1+2*3+2+4”;
String inputPattern=“(\\d+|[+-/*]{1})”;
List strList=new ArrayList();
Pattern patternObj=Pattern.compile(inputPattern);
Matcher matcherObj=patternObj.Matcher(inputStr);
而(matcherObj.find()){
strList.add(matcherObj.group(0));
}
System.out.println(strList);

请保留@MichaelLihs的编辑,它非常好。已向版主标记两次积极的回滚。非常感谢先生。这对我帮助很大。
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);