我想用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)
但问题是,如果该功能有任何其他功能,{或者}它将无法正常工作.
更换[^{}]用.是不是一个解决方案,因为它取代了以下功能也.
使用正则表达式,可以完成此(括号嵌套),但只能达到固定的嵌套级别.
你现在的正则表达式(改了一下):
(@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)
更多信息在这个答案.
| 归档时间: |
|
| 查看次数: |
2414 次 |
| 最近记录: |