首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java regex:如何替换括号内的所有字符?

Java regex:如何替换括号内的所有字符?
EN

Stack Overflow用户
提问于 2012-03-18 18:11:31
回答 4查看 357关注 0票数 0

我如何能够替换:

代码语言:javascript
运行
复制
((90+1)%(100-4)) + ((90+1)%(100-4/(6-4))) - (var1%(var2%var3(var4-var5)))

使用

代码语言:javascript
运行
复制
XYZ((90+1),(100-4)) + XYZ((90+1),100-4/(6-4)) - XYZ(var1,XYZ(var2,var3(var4-var5)))

使用正则表达式?

谢谢,J

EN

回答 4

Stack Overflow用户

发布于 2012-03-18 19:28:19

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

因此(expression % expression)变成XYZ(expression,expression)

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

票数 1
EN

Stack Overflow用户

发布于 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

你至少可以查看它们,直到有一个深入的答案出现。

票数 0
EN

Stack Overflow用户

发布于 2012-03-19 23:31:32

请参阅以下代码:

代码语言:javascript
运行
复制
    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);

输出结果如您所料:

代码语言:javascript
运行
复制
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 ) )),因为否则你就没有遵循自己的约定。希望这段代码能帮助你。至少对我来说,这是一次很好的锻炼。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9757488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档