解析脚本文件(使用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;