2012-03-18 71 views
0

我怎麼能代替:Java正則表達式:如何替換括號內的所有字符?

((90+1)%(100-4)) + ((90+1)%(100-4/(6-4))) - (var1%(var2%var3(var4-var5))) 

XYZ((90+1),(100-4)) + XYZ((90+1),100-4/(6-4)) - XYZ(var1,XYZ(var2,var3(var4-var5))) 

用正則表達式?

感謝, Ĵ

+0

見[類似的問題]替換% [1]。 [1]:http://stackoverflow.com/questions/9734069/recursive-replace-with-java-regular-expression/9734720#9734720 – 2012-03-18 10:17:54

回答

1

這對於一個正則表達式來說看起來並不是很好。看起來你可能想寫一個快速的遞歸下降解析器。如果我理解正確,您想用函數名稱XYZ替換中綴運算符%?

所以(表達式%表達式)成爲XYZ(表達,表達)

這看起來像一個很好的資源來研究:http://www.cs.uky.edu/~lewis/essays/compilers/rec-des.html

+0

是。我認爲這是一個非常普遍的問題。我幾乎放棄使用正則表達式來處理嵌套和遞歸替換。我聽說樹結構能夠做到這一點。您提供的鏈接可能會有所幫助。它可能需要更多時間將其解釋爲Java代碼。任何幫助,真的很感激。謝謝。 – 2012-03-18 11:46:22

0

看到這個代碼:

String input = "((90+1)%(100-4)) + ((90+1)%(100-4/(6-4))) - (var1%(var2%var3(var4-var5)))"; 
    input = input.replaceAll("%", ","); 
    int level = 0; 
    List<Integer> targetStack = new ArrayList<Integer>(); 
    List<Integer> splitIndices = new ArrayList<Integer>(); 
    // add the index of last character as default checkpoint 
    splitIndices.add(input.length()); 
    for (int i = input.length() - 1; i >= 0; i--) { 
     if (input.charAt(i) == ',') { 
      targetStack.add(level - 1); 
     } else if (input.charAt(i) == ')') { 
      level++; 
     } 
     else if (input.charAt(i) == '(') { 
      level--; 
      if (!targetStack.isEmpty() && level == targetStack.get(targetStack.size() - 1)) { 
       splitIndices.add(i); 
      } 
     } 
    } 
    Collections.reverse(splitIndices); // reversing the indices so that they are in increasing order 
    StringBuilder result = new StringBuilder(); 
    for (int i = 1; i < splitIndices.size(); i++) { 
     result.append("XYZ"); 
     result.append(input.substring(splitIndices.get(i - 1), splitIndices.get(i))); 
    } 
    System.out.println(result); 

輸出結果你期望它:

XYZ((90+1),(100-4)) + XYZ((90+1),(100-4/(6-4))) - XYZ(var1,XYZ(var2,var3(var4-var5))) 

但請記住,我t有點不好,它可能不會像你期望的那樣工作。順便說一句,我不得不改變一點輸出我添加了幾個括號:XYZ((90 + 1), 100-4 /(6-4 )),否則你沒有遵循自己的約定。希望這段代碼可以幫助你。對我而言,這至少是一項很好的練習。

+0

謝謝鮑里斯。我嘗試了一些單元測試失敗。 (99)%(100)我可能需要添加((99)%(100))當我編碼時間和XYZ(3 + 4,XYZ(XYZ(XYZ(XYZ(99,100),88),6 )(%(6))%(5 + 2))編碼爲(3 + 4)%(((((99)%(100))%(88)以便使用上面回到XYZ(3 + 4,XYZ(XYZ(XYZ(XYZ(99,100),88),6),5 + 2))的算法進行解碼。我可能需要調整編碼函數,否則它將以不同的方式解碼。我想添加更多的括號,但仍然失敗。 – 2012-03-20 08:14:27

+0

對不起。我有我的代碼中的錯誤。我要解決它,然後重新發布正確的解決方案 – 2012-03-20 09:22:50

0

難道滿足您的要求做到以下幾點:

  1. 查找(在第一位置或空間開頭且XYZ(
  2. 更換查找%,取而代之的是,

如果這兩條指令足夠和令人滿意,則可以用三個「移動」來轉換原始字符串:

  1. 替換^\(XYZ(
  2. XYZ(
  3. 替換\(,
相關問題