如何将输入字符串解析为单个标记? (JAVA)

时间:2017-10-22 06:27:21

标签: java parsing

我正在尝试将表达式字符串解析为单个令牌单元以放入数组列表中。所以基本上,我给出了这样一个表达式:

(3 + 5)

一旦完成解析,它应该在数组列表中看起来像这样:

"(", "3", "+", "5", ")"

在这种情况下,应忽略空格。此外,如果表达式包含像“++”或“ - ”这样的运算符,它们应该存储为一个标记,而不是两个。例如,(++ 3)将会出现“(”,“++”,“3”,“)”。

我不确定我的方法是否正确,但我在想的是使用for循环遍历每个角色并查看它是否匹配。

更新:

    for(int i=0; i<expressionString.length(); i++) {
        //cast char into ascii int
        int ascii = (int) charAt(i);

        //appending to token if one of operator symbols
        if( ascii >= 40 && ascii <= 47 || ascii == 91 || ascii == 93){
            token.append((char) ascii);

        //appending to token if it's a num  
        } else if ( ascii >= 48 || ascii <=57) {
            token.append((char) ascii);

            //check if next char is a num, if so, append to token
            while ((int) charAt(i+1) >= 48 || (int) charAt(i+1) <=57) {
                //increment i in for loop to check
                i++;
                token.append((int) charAt(i));
            }

        }
        //  
    }

3 个答案:

答案 0 :(得分:1)

我认为,你正在寻找的是toCharArray(),这是最简单的解决方案,但是,如果有多个操作,它不会给你想要的输出

String str ="(3+5)";
str = str.replaceAll("\\s+",""); // remove all whitespaces
System.out.println(Arrays.toString(str.toCharArray()));

因此,您需要使用循环并继续检查具有下一个字符的字符,并在它们是相同类型时附加它们。然后,您需要ArrayList,您将继续添加String(到目前为止已添加)

    List<String> lstStr = new ArrayList<>();
    str= str.replaceAll("\\s+","");
    StringBuilder temp = new StringBuilder();
    int i;
    for (i=0; i<str.length()-1; i++)
    {

  // actually we looking, if they are same type  
 if(Character.isDigit(str.charAt(i))==Character.isDigit(str.charAt(i+1)))
       {
            temp.append(str.charAt(i));
       }
       else
       {
            temp.append(str.charAt(i));
            lstStr.add(temp.toString());
            temp.setLength(0);// reset StringBuilder to re-use
       }
    }

    temp.append(str.charAt(i));
    lstStr.add(temp.toString());
    System.out.println(Arrays.toString(lstStr.toArray()));

因为,我们实际上是循环到N-2,其中NString的长度,因此,我们需要将最后一个字符追加到StringBuilder然后添加它到List

答案 1 :(得分:1)

以下是使用java.util.Scanner的解决方案:

Scanner scanner = new Scanner("10++9+0-4");
// here I used regex that says "match any boundary or whitespace between an operator and a number"
// So the scanner will keep scanning until it reaches such a boundary, where it will return the result
scanner.useDelimiter("((?<=[+\\-*/])\\s*(?=\\d))|((?<=\\d)\\s*(?=[+\\-*/]))");
while (scanner.hasNext()) {
    System.out.println(scanner.next());
}

试用正则表达式here。看看它是否将字符串拆分到您想要的位置。

答案 2 :(得分:0)

一个正在运行的解决方案

public class ParseInputString {

    public static void main(String args[])
     {
        String a="(3 ++ 5)";
        char [] arr=a.replaceAll("\\s+","").toCharArray();

        Set<Character> charSet = new LinkedHashSet<Character>();
        for (char c : arr) {
            charSet.add(c);
        }
        List<Character> arrrList=new ArrayList<Character>();
        Iterator<Character> it = charSet.iterator();
        while(it.hasNext()){
            arrrList.add(it.next());
           }
        System.out.println(arrrList);
     } }