如果我有:
Scanner input = new Scanner(System.in);
System.out.println("Enter an infixed expression:");
String expression = input.nextLine();
String[] tokens;
如何一次扫描一个标记周围的中缀表达式,从左到右并放入一个字符串数组?这里token
被定义为操作数,运算符或括号符号。
示例:“3 +(9-2)”==> tokens = [3] [+] [(] [9] [ - ] [2] [)]
答案 0 :(得分:2)
String test = "13 + (9-2)";
List<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile("\\d+|\\(|\\)|\\+|\\*|-|/")
.matcher(test);
while (m.find()) {
allMatches.add(m.group());
}
有人可以测试吗?
答案 1 :(得分:0)
我认为最简单的方法是将行读入一个字符串,然后根据空格进行拆分。有一个方便的字符串函数split
可以为您完成此任务。
String[] tokens = input.split("");
答案 2 :(得分:0)
对于您的示例来说可能有些过分,但如果它变得更复杂,请查看Java编译器编译器JavaCC。 JavaCC允许您基于语法定义在Java中创建解析器。
请注意,这不是一个简单的入门工具。但是,语法定义比相应的正则表达式更容易阅读。
答案 3 :(得分:0)
如果tokens []必须是String,则可以使用此
String ex="3 + (9-2)";
String tokens[];
StringTokenizer tok=new StringTokenizer(ex);
String line="";
while(tok.hasMoreTokens())line+=tok.nextToken();
tokens=new String[line.length()];
for(int i=1;i<line.length()+1;i++)tokens[i-1]=line.substring(i-1,i);
令牌可以是charArray所以:
String ex="3 + (9-2)";
char tokens[];
StringTokenizer tok=new StringTokenizer(ex);
String line="";
while(tok.hasMoreTokens())line+=tok.nextToken();
tokens=line.toCharArray();
答案 4 :(得分:0)
这个(恕我直言)优雅的单行代码工作(测试):
String[] tokens = input.split("(?<=[^ ])(?<!\\B) *");
此正则表达式还适用于包含多个字符编号(例如123)的输入,这些字符编号将被拆分为单独的字符,但用于非字边界的负面后视(?<!\\B)
。
第一个后视(?<=[^ ])
会阻止在输入时初始空白字符串拆分,并确保消耗空格。
正则表达式" *"
的最后部分确保使用空格。