我有一个输入字符串,其形式为(剥离):
{
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)正则表达式 - 这导致我发表这篇文章
如果有不同的方式实现这一目标,那么我的所有耳朵都是如此。
由于
答案 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)