使用正则表达式,可以做到这一点(括号嵌套),但只能达到固定的嵌套级别。
您当前的正则表达式(更改了一点):
(@Override[\n\s\t]*)?public *(abstract)? *void *[a-z]*\([a-z]* [^)]+\)[\n\\s\t]*((\{[^\{\}]*?\})|;)
只允许一级。更具体地说,这是匹配它的部分:
(\{[^\{\}]*?\})
如果您想匹配最多两个级别,请将提到的部分更改为:
(\{([^{}]*|\{[^{}]*\})*\})
因此:
(@Override[\n\s\t]*)?public *(abstract)? *void *[a-z]*\([a-z]* [^)]+\)[\n\\s\t]*(\{([^{}]*|\{[^{}]*\})*\}|;)
要添加更多级别,您必须继续编辑。随着您添加关卡,它会变得越来越混乱。
解释:
\{将匹配第一个左括号
(打开一个群组
[^{}]*匹配除括号之外的任何内容
|或者
\{如果它确实找到了一个左括号...
[^{}]*...它将匹配除括号之外的任何内容...
\}...直到找到一个右括号
)关闭组
*上述组可以发生零次或多次
\}匹配结束括号
要添加更多级别,请将中间(第二)[^{}]*部分更改为([^{}]*|\{[^{}]*\})*。
如果您无法预测最大嵌套级别:
有些语言允许嵌套运算符R,它允许您嵌套任意数量的级别。如果您的语言不支持它(Java 不支持,afaik PHP 和 Perl 支持),您必须:
R没有运算符的正则表达式不能嵌套任意数量的级别。
也就是说,使用R运算符将是这样的:
(\{([^{}]|(?R))*\})
此答案的更多信息。