使用正则表达式替换java函数:匹配嵌套括号

使用正则表达式替换java函数:匹配嵌套括号,java,regex,Java,Regex,我想用正则表达式替换函数定义和声明,即 替换 public abstract void myFuction(MyParam myParam); 或 我尝试使用这个正则表达式: (@Override[\n\s\t]*)?public *(abstract)? *void *generateProcessMethod *\(UIGenerationContext *[^)]+\)[\n\\s\t]*((\{[^{}]*?\})|;) 但问题是,如果该函数有任何其他{或},则它将无法工作 将[^{

我想用正则表达式替换函数定义和声明,即

替换

public abstract void myFuction(MyParam myParam);

我尝试使用这个正则表达式:

(@Override[\n\s\t]*)?public *(abstract)? *void
*generateProcessMethod *\(UIGenerationContext *[^)]+\)[\n\\s\t]*((\{[^{}]*?\})|;)
但问题是,如果该函数有任何其他
{
}
,则它将无法工作


[^{}]
替换为
不是一个解决方案,因为它还替换了以下函数。

仅使用正则表达式恐怕是不可能的

如果您理解正确,您需要重新格式化一些语法,并且我假设代码必须仍然是可编译的,在这种情况下,您需要计算每个
{
的增加值和每个
}
的减少值,以便知道函数何时结束。另一种选择是,一旦您面临下一个声明,就可以返回到第一个找到的
}
,但是会有很多异常需要处理,比如类结束时等等


我建议您使用Java源代码解析来完成这项工作,它将能够将方法识别为一种方法,并为您节省大量的工作,例如,看看Regex不擅长处理嵌套组件。但是,如果您知道,
@Override
将缩进与右大括号相同的位置,并且其所有内容将进一步缩进,则可以使用以下方法:

([\t\s]+)@Override.*?\n\1}

使用正则表达式,这(括号嵌套)确实可以执行,但只能执行固定级别的嵌套

您当前的正则表达式(有点变化):

只允许一个级别。更具体地说,这是与之匹配的部分:

(\{[^\{\}]*?\})
如果您希望最多匹配两个级别,请将提到的部分更改为:

(\{([^{}]*|\{[^{}]*\})*\})
因此:

要添加更多级别,您必须继续编辑。当你添加关卡时,它将变得越来越混乱

说明:

  • \{
    将匹配第一个开口括号
    • 打开一个组
      • [^{}]*
        匹配括号以外的任何内容
      • |
      • \{
        如果它确实找到一个左括号。。。
        • [^{}]*
          …它将匹配除括号以外的任何内容
      • \}
        …直到找到一个结束括号
    • 关闭组
    • *
      上述组可能发生零次或多次
  • \}
    匹配结束括号
要添加更多级别,请将中间(第二个)
[^{}]*
部分更改为
([^{}]*\{[^{}]*\})*

如果无法预测最大嵌套级别:


有些语言允许嵌套运算符
R
,它允许嵌套任意数量的级别。如果您的语言不支持它(Java不支持,afaik PHP和Perl不支持),您必须:

  • 预测最大嵌套水平;或
  • 自己创建一个解析器
正则表达式如果没有
R
运算符,就不能嵌套任意数量的级别

也就是说,使用
R
操作符将如下所示:

(\{([^{}]|(?R))*\})

更多信息,请访问。

语法识别工具,如JavaCC和ANTLR,可能适合您的任务如果您有intellij idea的最终版本,它们有非常强大的结构化搜索和替换工具,完全满足您的需要。您还可以看看Eclipse JDT API。我不能简单地添加这一点。。我想对一些具有相同定义的其他文件执行相同的操作,其中position@Abin,仅仅因为你想要一些东西并不意味着正则表达式可以完成它。我的意思是,这是相当神奇的,但是…有限制,可悲的是,这可能是最大的一个。我不能简单地添加这个。。我想对其他具有相同定义的文件执行相同的操作,位置发生变化,我无法添加每个级别。。因为我有多个文件具有相同的函数-有时函数可能会打开和关闭(例如,while循环或分组),这取决于函数在此处的实现方式,我只能猜测函数具有相同的名称和参数以及
{
}
。如果可以确定最大嵌套级别,您可以使用此解决方案。有些语言允许嵌套运算符
R
,它允许您嵌套任意数量的级别。如果您的语言不支持它(Java不支持,afaik PHP和Perl不支持),那么您必须预测最大嵌套级别,或者自己创建解析器。没有
R
操作符的Regex不能嵌套任意数量的级别。
(\{([^{}]*|\{[^{}]*\})*\})
(@Override[\n\s\t]*)?public *(abstract)? *void *[a-z]*\([a-z]* [^)]+\)[\n\\s\t]*(\{([^{}]*|\{[^{}]*\})*\}|;)
(\{([^{}]|(?R))*\})