解析脚本文件(使用Java)

时间:2012-02-14 06:16:12

标签: java parsing recursion

该文件包含

JAR_REPO=/ssnl/col/brf/jar
JAR_LOC=$JAR_REPO/log4.1.1j.jar
JAR_LOC=$JAR_LOC;$JAR_REPO/SnailClient.jar
FINAL_PATH=$JAR_REPO;$JAR_LOC;

FINAL_PATH的预期解析字符串或值将类似于

/ssnl/col/brf/jar;/ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar

如何使用递归调用实现此目的。 提前致谢

1 个答案:

答案 0 :(得分:0)

如果脚本文件只包含

形式的行
KEY=value

使用唯一键,您可以使用java.util.Properties类加载它。

然后,您需要做的就是检查所需键的值,如果它包含$WORD形式的任何字符串,并且WORD也是加载属性中的键。如果是,则递归计算该键的值。但是,如果根据自身重新定义变量,这种方法将陷入无限循环。


由于您的样本数据包括变量重新赋值和递归,因此解决方案是一次评估文件的每一行,并将评估结果存储到Map - 一种类似于memoization的技术。

以下是代码的要点:

    Pattern pattern = Pattern.compile("\\$([A-Z_0-9]+)");

    Map<String, String> vars = new HashMap<String, String>();
    FileReader f = new FileReader("input");
    BufferedReader in = new BufferedReader(f);

    for (String line = in.readLine(); line != null;
        line = in.readLine()) {
        String[] parts = line.split("=", 2);
        String key = parts[0];

        StringBuffer sb = new StringBuffer();
        Matcher m = pattern.matcher(parts[1]);
        while (m.find()) {
            String var = m.group(1);
            m.appendReplacement(sb, vars.get(var));
        }
        m.appendTail(sb);

        String value = sb.toString();
        vars.put(key, value);
        System.out.println(key + " <= " + value);
    }

    in.close();
    f.close();
}

输出

JAR_REPO <= /ssnl/col/brf/jar
JAR_LOC <= /ssnl/col/brf/jar/log4.1.1j.jar
JAR_LOC <= /ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar
FINAL_PATH <= /ssnl/col/brf/jar;/ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar;

正如所料。