2012-02-14 88 views
0

該文件包含解析腳本文件

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

請注意,'JAR_LOC'是第二次定義的兩次,就其本身而言。這可能會導致初始遞歸評估問題(將陷入無限循環)。如果您將第一個'JAR_LOC'重命名爲其他內容,例如'LOG4J_JAR',我可以使用示例代碼。 – 2012-02-14 06:44:50

+0

而不是「屬性」,我們可以使用Map(偏好。'LinkedHashMap'以相同的順序維護)。因此,在迭代中,當值包含$時,從map中獲取值。儘管如此,我們仍然需要解析價值。和/。它有意義嗎? – 2012-02-14 07:06:44

回答

0

如果腳本文件將只包含的形式

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; 

正如預期的那樣。