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

Abi*_*sia 4 java regex

我想用Regex替换函数定义和声明,即

更换

public abstract void myFuction(MyParam myParam);
Run Code Online (Sandbox Code Playgroud)

要么

@Override
public void myFuction(MyParam myParam){

}
Run Code Online (Sandbox Code Playgroud)

我试过这个正则表达式:

(@Override[\n\s\t]*)?public *(abstract)? *void
*generateProcessMethod *\(UIGenerationContext *[^)]+\)[\n\\s\t]*((\{[^{}]*?\})|;)
Run Code Online (Sandbox Code Playgroud)

但问题是,如果该功能有任何其他功能,{或者}它将无法正常工作.

更换[^{}].是不是一个解决方案,因为它取代了以下功能也.

acd*_*ior 6

使用正则表达式,可以完成此(括号嵌套),但只能达到固定的嵌套级别.

你现在的正则表达式(改了一下):

(@Override[\n\s\t]*)?public *(abstract)? *void *[a-z]*\([a-z]* [^)]+\)[\n\\s\t]*((\{[^\{\}]*?\})|;)
Run Code Online (Sandbox Code Playgroud)

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

(\{[^\{\}]*?\})
Run Code Online (Sandbox Code Playgroud)

如果您想匹配最多两个级别,请将提到的部分更改为:

(\{([^{}]*|\{[^{}]*\})*\})
Run Code Online (Sandbox Code Playgroud)

从而:

(@Override[\n\s\t]*)?public *(abstract)? *void *[a-z]*\([a-z]* [^)]+\)[\n\\s\t]*(\{([^{}]*|\{[^{}]*\})*\}|;)
Run Code Online (Sandbox Code Playgroud)

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

说明:

  • \{ 将匹配第一个开口括号
    • ( 打开一个小组
      • [^{}]* 匹配括号以外的任何东西
      • | 要么
      • \{ 如果确实找到了一个开口...
        • [^{}]* ...它将匹配支架以外的任何东西......
      • \} ......直到它找到一个结束括号
    • ) 关闭小组
    • * 上述组可以发生零次或多次
  • \} 匹配结束括号

要添加更多级别,请将中间(第二个)[^{}]*部分更改为([^{}]*|\{[^{}]*\})*.

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

有些语言允许嵌套操作符R,允许您嵌套任意数量的级别.如果你的语言不支持它(Java不支持PHP和Perl这样做),你必须要么:

  • 预测最大嵌套水平; 要么
  • 自己创建一个解析器.

没有R运算符的正则表达式不能嵌套任意数量的级别.

也就是说,使用R运营商将是这样的:

(\{([^{}]|(?R))*\})
Run Code Online (Sandbox Code Playgroud)

更多信息在这个答案.