将传入数据排列到具有特定条件的表中

时间:2014-08-25 17:37:14

标签: java string-formatting

我有一个示例文本文件,基本上是一个java程序。我的任务是编写一个程序,可以读取文本文件的每一行,并确定它是否是赋值语句。如果它是赋值语句,那么我需要打印出该赋值语句中使用的变量名。这是我需要的输出:

ASSIGNMENT STATEMENT       LEFT        RIGHT
data=5;                    data
one=data;                  one         data
x=5.6;                     x
test =(x+5.4)+one/x        test        x.one,x
age=3.5;                   age         
number = 0.2*(age-10);     number      age
x=x+num;                   x           x,num

我被卡住的地方是我提取x,一,x和第五行的部分。以及如何防止数字被打印。就像在data = 5中我怎么只打印数据并跳过5?

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用正则表达式?

String test = "(x+5.4)+one/x";
//regex: [0-9\"\/\,\(\)\+\-\*\.]+
test = test.replaceAll("[0-9\\\"\\/\\,\\(\\)\\+\\-\\*\\.]+",",");
System.out.println(test);

输出:

,x,one,x

然后,您可以使用以下命令替换第一个(最后一个)逗号:

test = test.replaceAll("^,", "").replaceAll(",$", "");

一些解释:

  1. ^表示测试字符串的开头,
  2. $代表结束
  3. [characters]+表示我们正在寻找字符串的一部分(+) 包含来自[]的字符。
  4. 如果没有+,它只会查找[]中的一个字符。
  5. 0-9表示所有数字(范围从09
  6. 您需要在所有\所有特殊字符之前添加",'\/()+-*.
  7. 在Java中,您需要在此正则表达式\之前添加额外的\
  8. 您可以测试/修改here

    修改 评论示例:

    String tem = "(x + 5.4)+ one/x"; 
    tem=tem.replaceAll("[0-9\\\"\\/\\,\\(\\)\\+\\-\\*\\.\\s]+",","); //here added \\s, and comma in second param. Without comma all params will be glued together.
    tem=tem.replaceAll("^,","").replaceAll(",$",""); //here you had space in second param of first replaceAll. Thats why the output was " xonex" - the space at the beginnig.
    System.out.println(tem);
    

    输出:

    x,one,x
    

    如果\s添加到正则表达式(\\s中必须为Java) - space的正则表达式。 请注意这个案例 - \S表示除space以外的所有内容。

    还要注意replaceAll()方法的第二个参数(",")。它是您想要插入的字符串,代替找到的正则表达式(第一个参数)。因此,如果您的参数用逗号分隔,则必须使用","作为第二个参数。如果你想删除一些东西(比如在这个例子的第二部分中我们从开头删除逗号,那么)你将""作为第二个参数。

答案 1 :(得分:0)

请参阅下面的代码来解析赋值语句并打印表中提到的变量和操作数。您可以按行读取文件行并按如下方式解析它。

public static void main(String[] args) {
    String code = "test =(x+5.4)+one/x";

    if (code.endsWith(";")) {
        code = code.substring(0, code.length() - 1);
    }
    String variable = code.substring(0, code.indexOf('=') - 1);
    String expression = code.substring(code.indexOf('=') + 1);

    List<String> operands = new ArrayList<String>();

    StringTokenizer tokens = new StringTokenizer(expression, "+,-,/,*,(,),%,\",&,|,!,<,>,=,^,~,:,?");
    while (tokens.hasMoreTokens()) {
        String token = tokens.nextToken();
        if (isNAN(token)) {
            operands.add(token);
        }
    }

    System.out.println("ASSIGNMENT STATEMENT\tLEFT\t\tRIGHT");
    System.out.printf("%s\t%s\t\t%s", code, variable, operands);
}

private static boolean isNAN(String string) {
    try {
        Double.parseDouble(string.trim());
        return false;
    } catch (NumberFormatException nfe) {
        //Do Nothing
        return true;
    }
}