使用正则表达式替换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))*\})