0

我该如何更换:

((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

4

4 回答 4

1

对于正则表达式来说,这看起来并不是一个很好的工作。看起来您可能想要编写一个快速递归下降解析器。如果我理解正确,您想用函数名称 XYZ 替换中缀运算符 % 吗?

所以 (表达式 % 表达式) 变成 XYZ(表达式, 表达式)

这看起来是一个很好的学习资源:http ://www.cs.uky.edu/~lewis/essays/compilers/rec-des.html

于 2012-03-18T11:28:19.317 回答
0

我不太了解正则表达式,但请尝试查看此内容,尤其是 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-18T11:21:12.730 回答
0

请参阅此代码:

    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)))

但是请记住,它有点 hacky,它可能无法完全按照您的预期工作。顺便说一句,我不得不稍微改变一下我添加了几个括号的输出:XYZ((90+1), ( 100-4/(6-4 ) )) 因为否则你没有遵循自己的约定。希望这段代码对您有所帮助。对我来说,这至少是一个很好的练习。

于 2012-03-19T15:31:31.603 回答
0

执行以下操作是否满足您的要求:

  1. 在第一个位置查找(或前面有空格并将其替换为XYZ(
  2. 查找%并替换为,

如果这两个指令足够且令人满意,那么您可以将原始字符串转换为三个“移动”:

  1. 替换^\(XYZ(
  2. 替换\(XYZ(
  3. 替换%,
于 2016-08-19T21:52:24.883 回答