我试图将数组和变量与表达式分开,以便我可以使用数组名称或变量填充两个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
的表达式,我不知道如何判断 varz
和 varb
是数组名称,而 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/