使用正则表达式,可以做到这一点(括号嵌套),但只能达到固定的嵌套级别。
您当前的正则表达式(更改了一点):
(@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))*\})
此答案的更多信息。