0

我正在尝试连接并尝试同时解析。我现在正在制作一个类似 excel 的程序,我可以在其中说 a1 =“Hello”+“World”,并且在 A1 的单元格中说 HelloWorld。我只需要知道如何解析加号并连接这两个词。请告诉我您是否需要更多代码来理解这一点,例如跑步者。

这是我的 parseInput 类:

public class ParseInput {
    private static String inputs;
    static int col;
    private static int row;
    private static String operation;
    private static Value field;


    public static void parseInput(String input){
         //splits the input at each regular expression match. \w is used for letters and \d && \D for integers
        inputs = input;
        Scanner tokens = new Scanner(inputs);
        String none0 = tokens.next();
        @SuppressWarnings("unused")
        String none1 = tokens.next();
        operation = tokens.nextLine().substring(1);
        String[] holder =  new String[2];
        String regex = "(?<=[\\w&&\\D])(?=\\d)";   
        holder = none0.split(regex);
        row = Integer.parseInt(holder[1]);
        col = 0;
        int counter = -1;
        char temp = holder[0].charAt(0);
        char check = 'a';
        while(check <= temp){
            if(check == temp){
                col = counter +1;
            }
            counter++;
            check = (char) (check + 1);
        }
         System.out.println(col);
         System.out.println(row);
         System.out.println(operation);
         setField(Value.parseValue(operation));

         Spreadsheet.changeCell(row, col, field);

    }

    public static Value getField() {
        return field;
    }

    public static void setField(Value field) {
        ParseInput.field = field;
    }
}
4

6 回答 6

2

这实际上是一个相当复杂的问题,除非您可以将输入限制为 Excel 接受的一小部分内容。如果没有,那么您可能会想研究类似ANTLR的东西。但是,假设上述输入,那么您将需要执行以下操作:

  1. 将等号上的字符串拆分为 s1 和 s2
  2. 将加号上的 s2 拆分为 s3 和 s4。
  3. 修剪所有字符串,删除 s3 和 s4 周围的引号。
  4. 连接 s3 和 s4 并分配给由 s1 索引的数据存储。

根据您的连接需求的复杂程度,您可以使用字符串连接或 StringBuilder:

result = "" + s3 + s4; // string concatenation
result = new StringBuilder().append(s3).append(s4).toString(); // StringBuilder

如果您对上述任何步骤有任何疑问,请告诉我。

上面(1)的细节,假设inputa1 = "Hello" + "World"

String[] strings = input.split("=");
String s1 = strings[0].trim(); // a1
String s2 = strings[1].trim(); // "Hello" + "World"

strings = s2.split("+");
String s3 = strings[0].trim().replaceAll("^\"", "").replaceAll("\"$", "") // Hello
String s4 = strings[1].trim().replaceAll("^\"", "").replaceAll("\"$", ""); // World
String field = s3 + s4;

String colString = s1.replaceAll("[\\d]", ""); // a
String rowString = s1.replaceAll("[\\D]", ""); // 1
int col = colString.charAt(0) - 'a'; // 0
int row = Integer.parseInt(rowString);

Spreadsheet.changeCell(row, col, field);
于 2012-04-09T03:00:21.910 回答
1

我建议您使用JavaCC 之类的解析器生成器来实现您的自定义语法。

在这里你可以找到一个简单的教程

我相信这是更好的解决方案,因为这样你就可以处理你需要的每一个表达式。

于 2012-04-09T03:02:19.113 回答
0

您需要设计和实现解析器和评估器。在此之前,您需要设计解析器/评估器将要评估的语言。

怎么做。

  • 如果你的语言真的很简单,你可以手动解析它,使用类似 StringTokenizer 的东西来做标记化,

  • 否则,您可能最好学习使用 Java“解析器生成器”,例如 JavaCC 或 ANTLR。

无论哪种方式,您都需要阅读一些背景知识来理解所有术语。您可以从 Wikipedia 和/或其中一个解析器生成器的教程材料开始。或者,有关于这个主题的好教科书。

于 2012-04-09T03:06:08.773 回答
0

除了 Abdullah 所说的,如果你真的想尽可能节省每一盎司的内存,你应该使用 StringBuilder 而不是 String 连接。我相信我之前在某处读过,字符串连接为每个连接创建一个新的字符串对象,而 StringBuilder 会将它们全部添加到单个字符串中。不过应该没有太大关系。

于 2012-04-09T03:20:17.517 回答
0

您确定要使用您正在使用的所有类吗?要解析“a=b+c+d..”之类的内容(假设您不尝试验证),最简单且可能最有效的方法是在 Java lang String 中使用 split API

然后使用StringBuilder加入任何需要的内容

于 2012-04-09T03:01:20.880 回答
0

在我早年的生活中,我按照您的风格制作了一个方程求值器。由于我对表达式树一无所知,这花费了我大量的代码和复杂性。但是现在有了这个,您将能够轻松地使用本机 JAVA 代码向解析器添加更多功能。您将获得大量使用表达式树的示例。

于 2012-04-09T03:35:10.480 回答