该文件包含
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
如何使用递归调用实现此目的。 提前致谢
井
答案 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;
正如所料。