2

如果我有:

Scanner input = new Scanner(System.in);

System.out.println("Enter an infixed expression:");
String expression = input.nextLine();

String[] tokens;

如何一次从左到右扫描空格周围的中缀表达式并将其放入字符串数组中?这里 atoken定义为操作数、运算符或括号符号。

示例:“3 + (9-2)” ==> 标记 = [3][+][(][9][-][2][)]

4

5 回答 5

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());
}

有人可以测试一下吗?

于 2013-04-29T18:39:24.903 回答
0

这个(恕我直言优雅)单行代码有效(经过测试):

String[] tokens = input.split("(?<=[^ ])(?<!\\B) *");

此正则表达式还适用于包含多个字符号(例如 123)的输入,这些字符号将被拆分为单独的字符,但用于非单词边界的负向后查找(?<!\\B)

如果输入,第一个后视(?<=[^ ])防止在开始时拆分初始空白字符串,并确保使用空格。

正则表达式的最后一部分" *"确保空间被消耗。

于 2013-04-29T20:16:01.543 回答
0

我认为将这一行读入一个字符串,然后根据空格分割是最简单的。有一个方便的字符串函数split可以为您执行此操作。

String[] tokens = input.split("");
于 2013-04-29T18:37:36.880 回答
0

对于您的示例而言,这可能有点矫枉过正,但如果它变得更复杂,请查看JavaCC,即 Java Compiler Compiler。JavaCC 允许您基于语法定义在 Java 中创建解析器。

请注意,这不是一个容易上手的工具。但是,语法定义会比相应的正则表达式更容易阅读。

于 2013-04-29T19:45:50.923 回答
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();
于 2013-04-29T20:09:28.410 回答