我如何能够替换:
((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)))
使用正则表达式?
谢谢,J
发布于 2012-03-18 19:28:19
对于正则表达式来说,这看起来并不是一个很好的工作。看起来你可能想要写一个快速的递归下降解析器。如果我理解正确的话,您想用函数名XYZ替换中缀运算符%?
因此(expression % expression)变成XYZ(expression,expression)
这看起来是一个很好的学习资源:http://www.cs.uky.edu/~lewis/essays/compilers/rec-des.html
发布于 2012-03-18 19:21:13
我对正则表达式知之甚少,但是试着看看这个,特别是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
你至少可以查看它们,直到有一个深入的答案出现。
发布于 2012-03-19 23:31:32
请参阅以下代码:
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)))
但是,请记住,它有点老生常谈,可能不会完全按照您的预期工作。顺便说一句,我不得不稍微修改一下输出,我添加了几个括号: XYZ((90+1),( 100-4/(6-4 ) )),因为否则你就没有遵循自己的约定。希望这段代码能帮助你。至少对我来说,这是一次很好的锻炼。
https://stackoverflow.com/questions/9757488
复制相似问题