Java:基于匹配组内容的正则表达式替换

时间:2015-09-22 15:02:51

标签: java regex

我有一个输入字符串,其形式为(剥离):

{
    headers : {
        root : function () { return context('headers'); },
        types : function () { return context('headers/types'); },
        groups : function () { return context('headers/groups'); },
    },
    sidebar : {
        remove : function () { return contextUrl('sidebars/remove/'); }
    },
    footer : {
        root : function () { return contextUrl('footer'); }
    }
}

我正在尝试编写一个正则表达式,它将使用位于其中的上下文函数之间的字符串替换所有函数调用。

示例:基于上述输入的所需输出为:

{
    headers : {
        root : 'headers',
        types : 'headers/types',
        groups : 'headers/groups',
    },
    sidebar : {
        remove : 'sidebars/remove/'
    },
    footer : {
        root : 'footer'
    }
}

我还没有写过一个正则表达式,以前用另一个组的匹配替换一个组。我假设使用一个正则表达式无法做到这一点?

感谢。

更新:

我意识到我可能正在为此目的而屠杀正则表达式..但是考虑到其他替代方案(我能想到),这被认为是最好的方法:

1)输入字符串是有效的JavaScript,因此我可以通过java的脚本引擎运行它,让引擎完成工作。这意味着我需要为每个函数调用添加自调用标记,伪造它们以调用并返回值 - 所有非常混乱

2)字符串替换 - 链接一些字符串替换调用以完全去掉函数 - 非常凌乱

3)正则表达式 - 这导致我发表这篇文章

如果有不同的方式实现这一目标,那么我的所有耳朵都是如此。

由于

2 个答案:

答案 0 :(得分:1)

这个正则表达式为我创建了所需的输出

String s = "{\n"
        + "    headers : {\n"
        + "      root : function () { return context('headers'); },\n"
        + "      types : function () { return context('headers/types'); },\n"
        + "      groups : function () { return context('headers/groups'); },\n"
        + "    },\n"
        + "    sidebar : {\n"
        + "        remove : function () { return contextUrl('sidebars/remove/'); }\n"
        + "    },\n"
        + "    footer : {\n"
        + "        root : function () { return contextUrl('footer'); }\n"
        + "    }\n" + "}";
System.out.println(s.replaceAll("function\\s+\\(.*\\)\\s+\\{\\s+return\\s+[A-Za-z]+\\(('[A-Za-z\\s/]+')\\)\\s*;\\s+\\}", "$1"));

编辑:请注意,对给定String语法的轻微更改将导致错误的结果。

答案 1 :(得分:0)

正则表达式可能不是最好的工具,但您可以尝试:

(?<=:\s)function\s*\(\)\s\{[^(]+\(('[^']+')\);\s\}

DEMO

您可以使用replaceAll("$1")