Если файл скрипта будет содержать только строки вида
KEY=value
Используя уникальные ключи, вы можете загрузить его, используя java.util.Properties class.
Затем все, что вам нужно сделать, это проверить значение требуемого ключа, если он содержит какие-либо строки вида $WORD
и если WORD
также является ключом в загруженных свойствах. Если это так, то рекурсивно оцените значение этого ключа. Однако этот подход попадет в бесконечный цикл, если переменная будет переопределена в терминах самой себя.
Поскольку ваши данные выборки включают в себя переменное переназначение и рекурсию, тогда решение состоит в том, чтобы оценивать каждую строку файла по одному и сохранять результаты оценки в Map
- методике, аналогичной запоминанию.
Вот суть кода:
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;
Как и ожидалось.