我怎麼能代替: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)))
用正則表達式?
感謝, Ĵ
我怎麼能代替: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)))
用正則表達式?
感謝, Ĵ
我不知道很多關於正則表達式,但嘗試尋找這一點,尤其是9和10: http://www.mkyong.com/regular-expressions/10-java-regular-expression-examples-you-should-know/
,當然還有: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
你可以至少檢查一下,直到有深入的答案出現。
這對於一個正則表達式來說看起來並不是很好。看起來你可能想寫一個快速的遞歸下降解析器。如果我理解正確,您想用函數名稱XYZ替換中綴運算符%?
所以(表達式%表達式)成爲XYZ(表達,表達)
這看起來像一個很好的資源來研究:http://www.cs.uky.edu/~lewis/essays/compilers/rec-des.html
是。我認爲這是一個非常普遍的問題。我幾乎放棄使用正則表達式來處理嵌套和遞歸替換。我聽說樹結構能夠做到這一點。您提供的鏈接可能會有所幫助。它可能需要更多時間將其解釋爲Java代碼。任何幫助,真的很感激。謝謝。 – 2012-03-18 11:46:22
看到這個代碼:
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 ))),否則你沒有遵循自己的約定。希望這段代碼可以幫助你。對我而言,這至少是一項很好的練習。
謝謝鮑里斯。我嘗試了一些單元測試失敗。 (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
對不起。我有我的代碼中的錯誤。我要解決它,然後重新發布正確的解決方案 – 2012-03-20 09:22:50
難道滿足您的要求做到以下幾點:
(
在第一位置或空間開頭且XYZ(
%
,取而代之的是,
如果這兩條指令足夠和令人滿意,則可以用三個「移動」來轉換原始字符串:
^\(
與XYZ(
XYZ(
\(
與,
見[類似的問題]替換
%
[1]。 [1]:http://stackoverflow.com/questions/9734069/recursive-replace-with-java-regular-expression/9734720#9734720 – 2012-03-18 10:17:54