我可以将 ABC(10,5)
替换为 (10)%(5)
使用:
replaceAll("ABC\\(([^,]*)\\,([^,]*)\\)", "($1)%($2)")
但我不知道如何为 ABC(ABC(20,2),5)
或 ABC(ABC(30,2),3+2 )
。
如果我能够转换为 ((20)%(2))%5
我怎样才能转换回 ABC(ABC(20,2),5)
?
谢谢, j
最佳答案
我先回答第一个问题。我无法在单个 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 请求,我添加了用于解码字符串的代码。它比前向场景更 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)
关于java - 递归替换为 Java 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734069/