java - 如何使用 StringTokenizer 将变量和数组从表达式中分离出来?

标签 java

我试图将数组和变量与表达式分开,以便我可以使用数组名称或变量填充两个ArrayList。我正在使用 StringTokenizer。我已经分解了表达式,但我无法确定哪些标记是数组名称,哪些是变量。

public void buildSymbols() {
    String s = expr; // input from different part of the program 
    StringTokenizer st = new StringTokenizer(s, "+-*/[]() ");
    while(st.hasMoreElements()){
        String temp = st.nextToken();
        System.out.println(temp);
    }
}

我打印 temp 只是为了确保表达式被分隔,但给定一个诸如 (varx + Vary * varz[(vara + varb[(a + b) * 33])])/55 的表达式,我不知道如何判断 varzvarb 是数组名称,而 varx、vary、vara、a 和 b 是变量。

有什么想法可以做到这一点吗?

最佳答案

我同意 EJP:正确的解决方案是使用特定的解析器。但是,如果您愿意识别每次调用 StringTokenizer.nextToken 找到的分隔符,您可以告诉 StringTokenizer 也返回分隔符。此外,您还需要检索每个当前标记上的下一个分隔符(作为前瞻)。为此,最好将所有标记存储在列表中:

public void buildSymbols() {
    String s = expr; // input from different part of the program 
    StringTokenizer st = new StringTokenizer(s, "+-*/[]() ", true);
    Set<String> delimiters=new HashSet<String>(Arrays.asList(new String[]{"+","-","*","/","[","]","(",")"," "}));
    List<Object> tokens=Collections.list(st);
    for(int i=0;i<tokens.size();i++){
        String temp = tokens.get(i).toString();
        if (delimiters.contains(temp))
        {
            // It is a delimiter
        }
        else
        {
            // It is a term
            boolean isAnArray=(isNextTokenAnOpenBracket(tokens, i));
            ...
        }
        System.out.println(temp);
    }
}

private boolean isNextTokenAnOpenBracket(List<Object> tokens, int currentIndex)
{
    return (currentIndex < tokens.size() && "[".equals(tokens.get(1 + currentIndex)));
}

关于java - 如何使用 StringTokenizer 将变量和数组从表达式中分离出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33073142/

相关文章:

java - 我们可以在 Hibernate 上持久化内部枚举吗?

java - 如何将 JLabel 对齐到 JPanel 的底部

java - 如何在二维数组中找到数字的平均值

java - C++ JMS 客户端或 C++/C SOAP 客户端

java - Spring-Ws 从响应中删除 namespace 前缀(ns2,ns3 ...)

java - Primefaces JSF 多次打开对话框会缓慢增加浏览器内存

java - 是否需要进行 if(log.isDebugEnabled()) { ... } 检查?

java - 我如何访问 Struts 2 拦截器中的 HttpSession?我是不是该?

java - TextField 中的值抛出 java.lang.NumberFormatException 错误

java - 有没有办法存储 Eclipse 的完整配置,这样就不需要进一步的配置了?