最初の質問についてはお答えします。私は単一のreplaceAll
の仕事をすることができませんでした。私はそれが達成可能であるとは思わない。しかし、私はループを使用している場合、これはあなたのための作業を行う必要があります。
String termString = "([0-9+\\-*/()%]*)";
String pattern = "ABC\\(" + termString + "\\," + termString + "\\)";
String [] strings = {"ABC(10,5)", "ABC(ABC(20,2),5)", "ABC(ABC(30,2),3+2)"};
for (String str : strings) {
while (true) {
String replaced = str.replaceAll(pattern, "($1)%($2)");
if (replaced.equals(str)) {
break;
}
str = replaced;
}
System.out.println(str);
}
私は用語termString = "([0-9+\\-*/()%]*)"
のように定義、あなたが数値式のためのパーサを書いていると仮定しています。私は、文字列を復号するためのコードを追加OPの要求を1として
(10)%(5)
((20)%(2))%(5)
((30)%(2))%(3+2)
EDIT:それはこれを出力します。これは、もう少しハック前方シナリオより:
String [] encoded = {"(10)%(5)", "((20)%(2))%(5)", "((30)%(2))%(3+2)"};
String decodeTerm = "([0-9+\\-*ABC\\[\\],]*)";
String decodePattern = "\\(" + decodeTerm + "\\)%\\(" + decodeTerm + "\\)";
for (String str : encoded) {
while (true) {
String replaced = str.replaceAll(decodePattern, "ABC[$1,$2]");
if (replaced.equals(str)) {
break;
}
str = replaced;
}
str = str.replaceAll("\\[", "(");
str = str.replaceAll("\\]", ")");
System.out.println(str);
}
、出力は次のとおりです。
ABC(10,5)
ABC(ABC(20,2),5)
ABC(ABC(30,2),3+2)
Borisありがとうございます。再帰的にABC(10,5)に変換するのは難しいです。親切なアドバイス。 –
私の解決策もこの質問に追加しました。 –
ボリスに感謝します。デコーダは素晴らしいです。 ABC((60 + 3)、(5-3))にこのような((60 + 3))%((5-3))をデコードできるように少し変更するだけです。 –