Я собираюсь ответить на первый вопрос. Я не смог выполнить задачу за один 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+\\-*/()%]*)"
. Это выводит это:
(10)%(5)
((20)%(2))%(5)
((30)%(2))%(3+2)
РЕДАКТИРОВАТЬ В соответствии с запросом OP я добавляю код для декодирования строк. Это немного более хакерский, чем прямой сценарий:
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)