解析脚本文件(使用Java)

解析脚本文件(使用Java),java,parsing,recursion,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; 最终路径的预期解析字符串或值如下 /ssnl/col/brf/jar;/ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar 如何使用递归调用

该文件包含

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;
最终路径的预期解析字符串或值如下

/ssnl/col/brf/jar;/ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar
如何使用递归调用实现这一点。 提前谢谢


如果脚本文件仅包含表单的行,则为

KEY=value
使用唯一键,然后可以使用类加载它

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


由于示例数据包括变量重新赋值和递归,因此解决方案是一次对文件的每一行求值,并将求值结果存储到
映射中,这是一种类似于记忆的技术

以下是代码的要点:

    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();
}
Pattern=Pattern.compile(“\\$([A-Z\u 0-9]+)”);
Map vars=newhashmap();
FileReader f=新的FileReader(“输入”);
BufferedReader in=新的BufferedReader(f);
for(String line=in.readLine();line!=null;
line=in.readLine()){
String[]parts=line.split(“=”,2);
字符串键=部件[0];
StringBuffer sb=新的StringBuffer();
匹配器m=模式匹配器(部分[1]);
while(m.find()){
字符串var=m.group(1);
m、 (sb,vars.get(var));
}
m、 (某人);
字符串值=sb.toString();
变量put(键、值);

System.out.println(key+“注意,
JAR\u LOC
是第二次定义的,就其本身而言。这可能会导致简单递归计算的问题(将陷入无限循环)。如果您将第一个
JAR_LOC
重命名为其他名称,例如
LOG4J_JAR
,我有一个示例代码可以使用。我们可以使用Map代替“Properties”(首选“LinkedHashMap”以相同的顺序维护)。因此,在迭代过程中,当值包含$时,从映射中获取值。我们仍然需要基于;和/解析值。这有意义吗?
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;