Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:基于匹配组内容的正则表达式替换_Java_Regex - Fatal编程技术网

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\}