如果腳本文件將只包含的形式
KEY=value
的線,獨特鍵,那麼你可以使用java.util.Properties類加載它。
然後,您只需檢查所需密鑰的值(如果其包含任何形式爲$WORD
的字符串,並且WORD
也是加載屬性中的密鑰)。如果是,則遞歸評估該密鑰的值。然而,如果一個變量本身被重新定義,這種方法將陷入無限循環。
由於您的樣本數據包括可變重新分配和遞歸,然後將溶液在時間來評估該文件一個的每一行,以及評價的結果存儲到一個類似於記憶化Map
-a技術。
下面的代碼的要點:
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;
正如預期的那樣。
請注意,'JAR_LOC'是第二次定義的兩次,就其本身而言。這可能會導致初始遞歸評估問題(將陷入無限循環)。如果您將第一個'JAR_LOC'重命名爲其他內容,例如'LOG4J_JAR',我可以使用示例代碼。 – 2012-02-14 06:44:50
而不是「屬性」,我們可以使用Map(偏好。'LinkedHashMap'以相同的順序維護)。因此,在迭代中,當值包含$時,從map中獲取值。儘管如此,我們仍然需要解析價值。和/。它有意義嗎? – 2012-02-14 07:06:44