Java:基于匹配组内容的正则表达式替换
我有一个输入字符串,其形式如下(精简): 我正在尝试编写一个正则表达式,它将用位于其中的上下文函数之间的字符串替换所有函数调用 示例:基于上述输入,我的期望输出为:Java:基于匹配组内容的正则表达式替换,java,regex,Java,Regex,我有一个输入字符串,其形式如下(精简): 我正在尝试编写一个正则表达式,它将用位于其中的上下文函数之间的字符串替换所有函数调用 示例:基于上述输入,我的期望输出为: { headers : { root : 'headers', types : 'headers/types', groups : 'headers/groups', }, sidebar : { remove : 'sidebars/remov
{
headers : {
root : 'headers',
types : 'headers/types',
groups : 'headers/groups',
},
sidebar : {
remove : 'sidebars/remove/'
},
footer : {
root : 'footer'
}
}
我以前没有写过用另一个组的匹配项替换一个组的正则表达式。我假设这不能用一个正则表达式来完成
谢谢
更新:
我意识到我可能是为了这个目的而屠杀regex。。但考虑到其他备选方案,我认为这是最好的方法(我可以想到):
1) 输入字符串是有效的JavaScript,因此我可以通过java的脚本引擎运行它,让脚本引擎完成工作。这意味着我需要在每个函数调用中添加自调用标记,伪造它们来调用并返回值——所有这些都非常混乱
2) 字符串替换-链接几个字符串替换调用以完全删除函数-非常混乱
3) 正则表达式-这让我找到了这篇文章
如果有不同的方法来实现这一点,我洗耳恭听
谢谢这个正则表达式为我创建了所需的输出
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"));
编辑:请注意,对给定字符串的语法稍作更改将导致错误的结果。Regex可能不是最好的工具,但您可以尝试使用:
(?<=:\s)function\s*\(\)\s\{[^(]+\(('[^']+')\);\s\}
(?您还可以使用更简单、更严格(不太宽容)的版本:“函数\(\\)\{return context(?:Url)?\\('[^']*')\\);\\”
@Andreas是的,这是真的,但我试图通过包括函数参数和多个空格来更宽容一点。谢谢你的回答。我确实去掉了示例输入字符串。完整版本确实有函数参数,所以请欣赏这方面的远见。谢谢你的回答。你能想到更好的方法吗o实现这一目标?
(?<=:\s)function\s*\(\)\s\{[^(]+\(('[^']+')\);\s\}