Я собираюсь ответить на первый вопрос. Я не смог выполнить задачу в одном 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)
EDIT По желанию ОП я добавить код для декодирования строк.Это немного больше, чем Hacky вперед сценария:
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)
Спасибо, Борис. У меня возникли трудности с преобразованием обратно в ABC (10,5) рекурсивно. Добрый совет. –
Хорошо, я добавил свое решение и к этому вопросу. –
Спасибо, Борис. Декодер отлично выглядит. Мне просто нужно немного изменить его, чтобы декодировать такие ((60 + 3))% ((5-3)) на ABC ((60 + 3), (5-3)). –